我有一個執行緒可以叫它 t1,它會在 x 秒后定期發送一些東西。這個“x 秒部分”可以從其他執行緒 (t2)更改。我應該能夠從執行緒 t1 執行以下操作。
- 等待“x 秒”然后發送一些東西
- 如果執行緒 t2 發送另一個值 "x" ,則不要發送,而是轉到步驟 1。
為此,我在 wait_for() 中使用了條件變數
我只想在“x 秒”結束時發送。
目前我已經在沒有謂詞的情況下實作了它(因為我不需要它)是這樣的:
auto done = wait_for(lock,x seconds);
if(done == cv_status::timeout)
{
/*perform send operation*/
}
但有時我會看到“發送發生”在 timeout 之前,我認為這是由于虛假喚醒和缺少謂詞。
我的問題是如何在沒有謂詞的情況下處理虛假喚醒?我應該為此采取另一種方法嗎?我不需要謂詞,因為執行緒 t1 在特定條件下休眠(當 x 為 0 時),我希望它(t1)在沒有任何條件的情況下被 t2 喚醒。
這是我使用 cond 變數的第一個任務,我仍在學習 CPP,在此先感謝您。
uj5u.com熱心網友回復:
不,沒有謂詞就無法避免虛假喚醒。首先,這就是謂詞的用途。C 標準明確允許等待偶爾出現虛假喚醒,并且沒有辦法阻止它們。
您唯一的選擇是:
使用謂詞
不要使用謂詞,但要考慮到整個邏輯中可能存在虛假喚醒的事實。您無法防止虛假喚醒,因此請調整您的程式邏輯以適應它們。
例如:在這種情況下,您的目標是等待一段時間。所以,在等待之前,看看std::chrono::steady_clock::now()說什么,并計算在給定的時間段過去后它應該說什么。然后在您據稱等待規定的時間后再次檢查。如果它仍然小于預期的超時,計算剩余的時間,然后再次等待,希望下次有更好的運氣。起泡,沖洗,重復。
在所有情況下,請記住,即使沒有虛假喚醒,您也很少有保證。即使您要求在 5 秒后被喚醒,wait_for()回傳之前也可能需要一點時間。相應地規劃你的整體邏輯。
uj5u.com熱心網友回復:
您確實需要一個謂詞,因為您需要區分虛假喚醒和合法喚醒。
你可以做的是添加一個std::atomic<bool>告訴你 t2 是否發送了 x 更新。當 t2 發送更新時,它也會設定這個原子布林值。t2 在喚醒時使用它來忽略虛假喚醒,然后將其清除。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/318765.html
上一篇:多次啟動執行緒
