1. 程式人生 > >Linux-執行緒互斥-鎖

Linux-執行緒互斥-鎖

互斥鎖

    當一個共享資源的操作不是原子的,在多執行緒同時訪問共享資源時可能會出現達不到預期的效果錯誤,為了解決共享資源操作競爭的問題,引入了互斥鎖。

     1、訪問共享資源前,必須申請該互斥鎖,若處於開鎖狀態,則申請到鎖物件,並立即佔有該鎖,以防止其他執行緒訪問該資源;如果該互斥鎖處於鎖定狀態,則阻塞當前執行緒。

     2、只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒試圖釋放無效。

    init
        pthread_mutex_t mutex_lock;
        pthread_mutex_init(&mutex_lock,NULL);
    lock


        pthread_mutex_lock(&mutex_lock);  以阻塞方式申請互斥鎖;
        pthread_mutex_trylock(&mutex_lock)以非阻塞方式申請互斥鎖;
    unlock
        pthread_mutex_unlock(&mutex_lock);

例項

    2個執行緒分別對全域性變數count加加5000次,但由於操作count語句不是原子操作,會導致在最後給count記憶體賦值過程中被其他執行緒讀取導致出錯,這裡要想不出錯,2個辦法:

    1、語句改為:count++;

    2、加互斥鎖保護count資源;

#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include <sys/types.h>
#include <unistd.h>

int count = 0;
pthread_mutex_t mutex_lock;

void* pthread_run()
{
    int i = 0;
    int ret = 0;
    while(i < 5000)
    {
        pthread_mutex_lock(&mutex_lock);
        i++;
        ret = count;
        printf("process ID:%d,pthread ID:%lu,count:%d\n",getpid(),pthread_self(),count);
        count = ret + 1;
        pthread_mutex_unlock(&mutex_lock);
    }
    pthread_exit(NULL);
}
 
int main()
{
    pthread_t id1;
    pthread_t id2;

    pthread_mutex_init(&mutex_lock,NULL);
    pthread_create(&id1,NULL,&pthread_run,NULL);
    pthread_create(&id2,NULL,&pthread_run,NULL);
    pthread_join(id1,NULL);  
    pthread_join(id2,NULL);
    printf("count: %d\n",count);
    return 0;
}

核心執行緒鎖