linux線程互斥鎖的使用方法及代碼測試?

Tags: 代碼, 線程,

隨著任務的添加,將會面臨多線程編程。多線程編程可以提高任務的執行效率,但是面臨的問題是線程之間共享資源的保護問題,做好臨界資源的互斥。如果稍不注意,看似沒問題的代碼,運行之後就可以看到問題之所在。下面就從無鎖的狀態下代碼的運行結果和加上互斥鎖之後運行的結果對比。

工具/原料

win7 xshell ubuntu

方法/步驟

編輯調試代碼

#include

#include

int global_val = 0;

void *thread1(void *arg){

while(1){

global_val = global_val + 1;

printf("thread1 global_val=%d\n", global_val);

global_val = global_val + 1;

usleep(100);

printf("thread1 global_val=%d\n", global_val);

usleep(100);

}

return NULL;

}

void *thread2(void *arg){

while(1){

global_val = global_val + 1;

printf("thread2 global_val=%d\n", global_val);

usleep(100);

global_val = global_val + 1;

printf("thread2 global_val=%d\n", global_val);

usleep(100);

}

return NULL;

}

linux線程互斥鎖的使用方法及代碼測試

編譯測試代碼gcc mutex.c -o mutex -lpthread

linux線程互斥鎖的使用方法及代碼測試

查看運行結果,圖示位置發現問題。結果不正確。

linux線程互斥鎖的使用方法及代碼測試

上述代碼是無鎖狀態下的運行情況,運行結果與預期的結果不同,出現錯誤。下面我們加上互斥鎖。

#include

#include

pthread_mutex_t thread_mutex;

int global_val = 0;

void *thread1(void *arg){

while(1){

pthread_mutex_lock(&thread_mutex);

global_val = global_val + 1;

printf("thread1 global_val=%d\n", global_val);

global_val = global_val + 1;

usleep(100);

printf("thread1 global_val=%d\n", global_val);

usleep(100);

pthread_mutex_unlock(&thread_mutex);

}

return NULL;

}

void *thread2(void *arg){

while(1){

pthread_mutex_lock(&thread_mutex);

global_val = global_val + 1;

printf("thread2 global_val=%d\n", global_val);

usleep(100);

global_val = global_val + 1;

printf("thread2 global_val=%d\n", global_val);

usleep(100);

pthread_mutex_unlock(&thread_mutex);

}

return NULL;

}

int main(void){

pthread_t thread_id1 = 0, thread_id2 = 0;

pthread_mutex_init(&thread_mutex, NULL);

pthread_create(&thread_id1, NULL, thread1, NULL);

pthread_create(&thread_id2, NULL, thread2, NULL);

pthread_join(thread_id1, NULL);

pthread_join(thread_id2, NULL);

return 0;

}

linux線程互斥鎖的使用方法及代碼測試

保存代碼後編譯。

linux線程互斥鎖的使用方法及代碼測試

運行查看結果,與預期的一致。說明互斥鎖起到保護臨界資源的作用。

linux線程互斥鎖的使用方法及代碼測試

相關問題答案