天天看点

Linux互斥锁(互斥量)、线程分离

使用互斥锁实现线程同步时一般有四个步骤:

  • 初始化互斥锁 //pthread_mutex_init()
  • 加锁 //pthread_mutex_lock()、pthread_mutex_trylock
  • 解锁 //pthread_nutex_unlock()
  • 销毁锁 pthread_mutex_destroy()
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<string.h>

pthread_mutex_t mutex;
int cout=1;
int status=21;
void* pthread_func(void* arg)
{
        int idx1=0;
        while(idx1<100000)
        {
                pthread_mutex_lock(&mutex);
                printf("%d\n",cout++);
                pthread_mutex_unlock(&mutex);
                idx1++;
        }


        pthread_exit(&status);
}


int main()
{
        pthread_t pthread_id;
        /*设置线程分离*/
        pthread_attr_t attr;
        pthread_attr_init(&attr);
        pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
        /*初始化互斥锁*/
        pthread_mutex_init(&mutex,NULL);
        /*创建线程*/
        strerror(pthread_create(&pthread_id,&attr,pthread_func,NULL));

        /*住线程循环数数*/
        int idx=0;
        while(idx<100000)
        {
                pthread_mutex_lock(&mutex);
                printf("%d\n",cout++);
                pthread_mutex_unlock(&mutex);
                idx++;
        }

        /*销毁互斥锁*/
        pthread_mutex_destroy(&mutex);
        /*销毁分离属性*/
        pthread_attr_destroy(&attr);
        pthread_exit(NULL);
//      void* retval=NULL;
//      pthread_join(pthread_id,&retval);
//      printf("%d\n",*(int*)retval);
        return 0;
}

           

注意:设置了线程分离的属性以后就不能再使用pthread_join()回收子线程的资源了,否则会造成程序崩溃;

还有一种设置线程分离的方法是pthread_detach()函数;

继续阅读