2014-12-08 60 views
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對象。我的問題是爲什麼它不會導致僵局? 想象一個簡單的情況:

  1. 數等於零
  2. decrement_count被稱爲現在count_lock被鎖定
  3. 如果計數大於零
  4. increment_lock被稱作但受阻作爲count_lock
  5. count_lock將被解鎖此刻被鎖定
  6. 死鎖???

在此先感謝您的任何解釋!

+1

查看'pthread_conditions_wait'的文檔:* [This function] **以原子方式釋放互斥鎖**並導致調用線程在條件變量cond上阻塞;原子地這裏的意思是「原子上關於另一個線程訪問互斥體,然後是條件變量」。也就是說,如果另一個線程能夠在約程序線程釋放它之後獲取該互斥體,則該線程中對pthread_cond_broadcast()或pthread_cond_signal()的後續調用將表現得好像它是在about-阻止線程被阻塞。* – didierc 2014-12-08 00:17:43

回答