線程池中的一個互斥鎖問題
12: static void*
13: thread_routine(void *arg)
14: {
15: tpool_work_t *work;
16:
17: while(1) {
18:
19: pthread_mutex_lock(&tpool->queue_lock);
20: while(!tpool->queue_head && !tpool->shutdown) {
21: pthread_cond_wait(&tpool->queue_ready, &tpool->queue_lock);
22: }
23: if (tpool->shutdown) {
24: pthread_mutex_unlock(&tpool->queue_lock);
25: pthread_exit(NULL);
26: }
27: work = tpool->queue_head;
28: tpool->queue_head = tpool->queue_head->next;
29: pthread_mutex_unlock(&tpool->queue_lock);
30: //這裡如果其他線程先獲得鎖,然後運作之後改變了work的值,而後下面這行代碼再運作,會調用新的值麼?
31: work->routine(work->arg);
32: free(work);
33: }
34:
35: return NULL;
36: }
這兒有個疑問。互斥鎖解鎖後,其他并行的線程如果此時獲得鎖并修改了work的值,那麼程式不是出問題了麼??
互斥鎖
分享到:
------解決方案--------------------
你的這個work是局部變量,既不是static,也不是const,外面怎麼能看見呢,然後你這樣是想試用隊列模型一邊插入一邊讀取,這樣有個壞處,對于鎖的争用是很明顯的,并發是上不去的,你可以試用多隊列模型,或者是雙緩沖多隊列模型,将兩個鎖分開,隻能幫到你這裡了