[問題] pthread_cond_broadcast 後續執行順序

作者: worcdlo (worcdlo)   2021-06-23 17:23:23
開發平台(Platform): Linux
編譯器 GCC
額外使用到的函數庫(Library Used): pthread
問題(Question):
今天剛好在研究critical section以及pthread的CV,他必須搭配mutex lock才能運作。
我看網路的文章,都說當thread進到pthread_cond_wait()時,
會先卡在這裡並釋放lock,可以透過其他thread呼叫signal或是broadcast再度喚醒。
同時也有人提到signal是保證不少於一個blocked cond被喚醒,所以建議把if變成while。
這邊我困惑的點在於:
如下面程式,假設t1~t4現在都執行到wait階段,若t5呼叫了signal或是broadcast,
導致t1~t4都收到了訊號,當t5釋放lock後,是t1~t4都直接自由嗎?
還是說此時只會有一個thread自由 (搶到lock?),直到lock再度被釋放?
程式碼(Code):
x = 0;
y = 0;
// t1, t2, t3, t4
consumer(){
pthread_mutex_lock(&mut);
while (x <= y) {
pthread_cond_wait(&cond, &mut);
}
y++;
/* operate on x and y */
pthread_mutex_unlock(&mut);
}
// t5
producer(){
pthread_mutex_lock(&mut);
/* modify x and y */
x += 2;
if (x > y) {
// pthread_cond_signal(&cond);
pthread_cond_broadcast(&cond);
}
pthread_mutex_unlock(&mut);
}
另外想請教一下,OS問題跟程式設計類的問題,能在這版問嗎?
作者: F04E (Fujitsu)   2021-06-23 18:19:00
mutex同時間只能被一個執行緒擁有, 先後順序不保證
作者: worcdlo (worcdlo)   2021-06-23 18:43:00
所以wait呼叫後應該是類似condition+lock的感覺?
作者: dces4212 (flawless)   2021-06-23 19:11:00
也可以發八卦板釣jserv回答
作者: F04E (Fujitsu)   2021-06-23 20:15:00
你原文裡不就寫了cond_wait會釋放...
作者: worcdlo (worcdlo)   2021-06-23 20:32:00
我回文的意思是釋放之後,除了要等待cond,也要等待lock
作者: dces4212 (flawless)   2021-06-24 02:12:00
相關manpage可以參考一下,最有權威的文件。所有執行緒都會被叫醒(如果已經開始等待),但醒來後大家會競爭對應lock,只有搶贏的執行緒可以離開wait。關於你的留言,沒錯,wait裡面確實會再次嘗試搶lock。

Links booklink

Contact Us: admin [ a t ] ucptt.com