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可以讓其他被喚醒的線程繼續阻塞)