隨著任務的添加,將會面臨多線程編程。多線程編程可以提高任務的執行效率,但是面臨的問題是線程之間共享資源的保護問題,做好臨界資源的互斥。如果稍不注意,看似沒問題的代碼,運行之後就可以看到問題之所在。下面就從無鎖的狀態下代碼的運行結果和加上互斥鎖之後運行的結果對比。
工具/原料
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;
}
編譯測試代碼gcc mutex.c -o mutex -lpthread
查看運行結果,圖示位置發現問題。結果不正確。
上述代碼是無鎖狀態下的運行情況,運行結果與預期的結果不同,出現錯誤。下面我們加上互斥鎖。
#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;
}
保存代碼後編譯。
運行查看結果,與預期的一致。說明互斥鎖起到保護臨界資源的作用。