天天看點

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()函數;

繼續閱讀