[英]std::condition_variable without a lock
我正在嘗試同步一組線程。 這些線程大多數時候都處於睡眠狀態,醒來便完成了預定的工作。 我正在為他們使用std::thread
。
不幸的是,當我終止應用程序線程時,它無法退出。 在C#中,我可以使線程成為background
以便在應用程序退出時終止該線程。 在我看來,E ++ valint功能在C ++中不可用。
因此,我決定使用一種事件指示器,並使線程在應用程序退出時喚醒。 標准C ++ 11 std::condition_variable
需要唯一鎖,因此我無法使用它,因為我需要兩個線程同時喚醒(它們不共享任何資源)。
最終,我決定使用WinApi的CreateEvent
+ SetEvent
+ WaitForSingleObject
來解決此問題。
我有一種方法可以僅使用c ++ 11來實現相同的行為?
同樣,我想要什么:
所有對象都檢查是否有時間停止工作(我稱此變量為IsAliva
)。 實際上,所有線程都像這樣在循環中旋轉:
while (IsAlive) { // Do work std::this_thread::sleep_for(...); }
IsAlive
並退出。 是的,您可以使用條件變量,互斥鎖和某種標記的標准c ++機制來執行此操作
// Your class or global variables
std::mutex deathLock;
std::condition_variable deathCv;
bool deathTriggered = false;
// Kill Thread runs this code to kill all other threads:
{
std::lock_guard<std::mutex> lock(deathLock);
deathTriggered = true;
}
deathCv.notify_all();
// You Worker Threads run this code:
while(true)
{
... do work
// Now wait for 1000 milliseconds or until death is triggered:
std::unique_lock<std::mutex> lock(deathLock);
deathCv.wait_for(lock, std::chrono::milliseconds(1000), [](){return deathTriggered;});
// Check for death
if(deathTriggered)
{
break;
}
}
請注意,這在進入條件之前面對死亡觸發時可以正確運行。 您也可以使用wait_for的返回值,但是這種方式更易於閱讀imo。 另外,雖然不清楚,但多個線程休眠是可以的,因為wait_for代碼在休眠時內部解鎖了unique_lock並重新獲取它以檢查條件以及返回狀態。
最后,所有線程的確在檢查bool標志被序列化時“同時”喚醒,這僅適用於幾條指令,然后在它們退出循環時便解鎖了鎖。 這將是不明顯的。
在c ++ 11中,您應該能夠detach()
線程,以便將其視為守護程序線程,這意味着如果應用程序終止,該線程將自動停止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.