線程同步之條件變量注意問題理解

1、條件變量的作用:

條件變量與互斥量一起使用,個人理解,適用於共享資源需要滿足一定條件才需要執行的操作,如生產者-消費者模型中,生產者生產了資源並掛在公共區域後,消費者才能去消費這個資源;而單獨使用條件變量的情況是,共享資源不需要進行判斷;

2、生產者線程中,

2.1) pthread_mutex_unlock(),之後再 pthread_cond_singnal();

pthread_mutex_unlock();

pthread_cond_singnal();

分析:unlock之後,生產者線程失去鎖,此時,其他線程(沒有調用條件變量的線程)可以來搶鎖,假使鎖被沒有調用條件變量的線程搶到,改變了條件;此時生產者線程執行pthread_cond_singnal(),則消費者線程中pthread_cond_wait(),判斷條件又不滿足,會繼續阻塞。

2.2)pthread_cond_singnal()之後再pthread_mutex_unlock();

pthread_cond_singnal();

pthread_mutex_unlock();

分析:pthread_cond_singnal()調用之後,會首先喚醒pthread_cond_wait的線程,會避免1)中的競爭情況。

3、消費者線程中使用while

while(head==NULL)

pthread_cond_wait();

分析:之所以用while,是要進行兩次條件判斷,第一次,head==NULL,執行pthread_cond_wait(),阻塞等待signal,當signal來了之後,需要再次判斷head==NULL(因爲存在2.1中的情況,此時可能head==NULL 仍然成立;存在2.2中的情況,因爲pthread_cond_singnal()會喚醒至少一個線程,但同時只能讓一個線程執行操作(這個線程搶到了鎖),所以,使用while可以讓其他被喚醒的線程繼續阻塞)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章