2013-08-28 61 views
1

我正在尋找正確的解決方案來保護線程組,正如我通常對單個線程所做的那樣:即線程1和2中的任何一個或兩者都可以同時鎖定互斥M,也不能睡覺。互斥體M代表線程3.因此,如果線程3在被線程1或2或兩者鎖定的同時鎖定互斥體,則線程3將進入睡眠狀態。如果線程1或2在線程3鎖定互斥鎖時,則1或2(鎖定它的任何一個)也會進入休眠狀態,直到3釋放它...每個線程組中的線程互斥

謝謝。

+0

你這是什麼意思'或兩者可以鎖定互斥M在同一時間?一個互斥點只有一個線程鎖定,另一個必須等​​待 – jev

回答

0

如果您的意思是您不希望在關鍵部分中出現多於兩個線程,而第三個線程不在關鍵部分中,則必須使用初始化爲2的POSiX信號量。012xx信號量計數器可以初始化爲任意值值,每個sem_wait遞減計數器(鎖定它),每個sem_post遞增它(釋放它)。 互斥量是initiliazed爲1的信號量的特殊情況。

如果您的意思是您想要一個作者線程和兩個或更多讀者,則可以使用rwlocks。

+0

,實際上,rwlock正是我所需要的。謝謝。 – wick

0

但是我想要閱讀posix信號量的建議(這看起來完全是我想要的)我已經找到了以「舊時尚」方式實現它的方式:Stevens UNP p。 703,使用pthread_cond中,元代碼會是這樣:

int var = 0; 
pthread_mutex_t M; 
pthread_cond_t C; 

threadA:  lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M 
threadB:  lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M 

thread Main: lock M; while (var > 0) cond_wait(&C, &M); do_protected_job; unlock M 

也許,信號燈允許更少麻煩的方式一樣,我查一下......