簡體   English   中英

std :: condition_variable沒有鎖

[英]std::condition_variable without a lock

我正在嘗試同步一組線程。 這些線程大多數時候都處於睡眠狀態,醒來便完成了預定的工作。 我正在為他們使用std::thread

不幸的是,當我終止應用程序線程時,它無法退出。 在C#中,我可以使線程成為background以便在應用程序退出時終止該線程。 在我看來,E ++ valint功能在C ++中不可用。

因此,我決定使用一種事件指示器,並使線程在應用程序退出時喚醒。 標准C ++ 11 std::condition_variable需要唯一鎖,因此我無法使用它,因為我需要兩個線程同時喚醒(它們不共享任何資源)。

最終,我決定使用WinApi的CreateEvent + SetEvent + WaitForSingleObject來解決此問題。

我有一種方法可以僅使用c ++ 11來實現相同的行為?

同樣,我想要什么:

  1. 一組線程是獨立工作的,通常在特定時間段內處於睡眠狀態(不同的線程可能會有所不同;
  2. 所有對象都檢查是否有時間停止工作(我稱此變量為IsAliva )。 實際上,所有線程都像這樣在循環中旋轉:

     while (IsAlive) { // Do work std::this_thread::sleep_for(...); } 
  3. 線程必須能夠同時工作,而不是相互阻塞;
  4. 當應用關閉且事件觸發時,無論超時如何,線程都立即喚醒。
  5. 喚醒后,它會檢查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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM