1
我正在嘗試熟悉pthread庫。現在我正在閱讀有關條件變量(pthread_cond_t),所以我有一個關於它如何工作的問題。pthread庫的條件變量示例
我發現一些使用pthread_cond_t結構的簡單示例的源代碼(在這裏回答https://stackoverflow.com/a/525841/3008684和示例4-8有https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032r/index.html)。它看起來像這樣:
pthread_mutex_t count_lock;
pthread_cond_t count_nonzero;
unsigned count;
decrement_count()
{
pthread_mutex_lock(&count_lock);
while (count == 0)
pthread_cond_wait(&count_nonzero, &count_lock);
count = count - 1;
pthread_mutex_unlock(&count_lock);
}
increment_count()
{
pthread_mutex_lock(&count_lock);
if (count == 0)
pthread_cond_signal(&count_nonzero);
count = count + 1;
pthread_mutex_unlock(&count_lock);
}
正如你可以看到在這兩種方法中使用相同的count_lock對象。我的問題是爲什麼它不會導致僵局? 想象一個簡單的情況:
- 數等於零
- decrement_count被稱爲現在count_lock被鎖定 如果計數大於零
- increment_lock被稱作但受阻作爲count_lock
- count_lock將被解鎖此刻被鎖定
- 死鎖???
在此先感謝您的任何解釋!
查看'pthread_conditions_wait'的文檔:* [This function] **以原子方式釋放互斥鎖**並導致調用線程在條件變量cond上阻塞;原子地這裏的意思是「原子上關於另一個線程訪問互斥體,然後是條件變量」。也就是說,如果另一個線程能夠在約程序線程釋放它之後獲取該互斥體,則該線程中對pthread_cond_broadcast()或pthread_cond_signal()的後續調用將表現得好像它是在about-阻止線程被阻塞。* – didierc 2014-12-08 00:17:43