我在程序中發現了一個錯誤,即同一個線程被喚醒兩次,以便讓另一個線程運行,從而導致意外行爲。在我的程序中,所有等待的線程都應該每回合運行一次。發生此錯誤是因爲我使用信號量來使線程等待。在信號量初始化爲0時,每個線程在其無限循環開始時調用down
到信號量,並且主線程在for循環NThreads
(線程數)次中調用up
。有時,同一個線程將兩次調用up
,並出現問題。保證喚醒所有線程,並且每個線程只有一次
正確處理這個問題的方法是什麼?是使用條件變量和廣播的方式來做到這一點?它會保證每一個線程都只喚醒一次嗎?什麼是其他可能的好方法?
你的問題似乎含糊給我,但總的來說,是的,條件變量被用來測試如果一段代碼被允許運行。 – user2079303
我不相信條件變量會自己幫助你,你可以喚醒一個線程或喚醒所有線程,但是這個Waker無法知道或控制哪個阻塞線程將被解除阻塞。不幸的是,我認爲你需要一個互斥量來控制喚醒/阻塞狀態。 – Segfault
因爲您用c和C++標記了防止任何不重要的回覆的標記,因此您可以進行投票 – kfsone