[問題] pthread_cond_broadcast 後續執行順序

看板C_and_CPP (C/C++)作者時間4年前 (2021/06/23 17:23), 編輯推噓2(207)
留言9則, 3人參與, 4年前最新討論串1/1
開發平台(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問題跟程式設計類的問題,能在這版問嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.176.57.68 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1624440205.A.EB2.html

06/23 18:19, 4年前 , 1F
mutex同時間只能被一個執行緒擁有, 先後順序不保證
06/23 18:19, 1F

06/23 18:43, 4年前 , 2F
所以wait呼叫後應該是類似condition+lock的感覺?
06/23 18:43, 2F

06/23 19:11, 4年前 , 3F
也可以發八卦板釣jserv回答
06/23 19:11, 3F

06/23 20:15, 4年前 , 4F
你原文裡不就寫了cond_wait會釋放...
06/23 20:15, 4F

06/23 20:32, 4年前 , 5F
我回文的意思是釋放之後,除了要等待cond,也要等待lock
06/23 20:32, 5F

06/24 02:12, 4年前 , 6F
相關manpage可以參考一下,最有權威的文件。所有執行緒
06/24 02:12, 6F

06/24 02:12, 4年前 , 7F
都會被叫醒(如果已經開始等待),但醒來後大家會競爭對
06/24 02:12, 7F

06/24 02:12, 4年前 , 8F
應lock,只有搶贏的執行緒可以離開wait。關於你的留言
06/24 02:12, 8F

06/24 02:12, 4年前 , 9F
,沒錯,wait裡面確實會再次嘗試搶lock。
06/24 02:12, 9F
文章代碼(AID): #1WqlsDwo (C_and_CPP)
文章代碼(AID): #1WqlsDwo (C_and_CPP)