gpt4 book ai didi

c++ - std::condition_variable 没有锁

转载 作者:搜寻专家 更新时间:2023-10-31 01:34:38 25 4
gpt4 key购买 nike

我正在尝试同步一组线程。这些线程大部分时间都在休眠,醒来后执行它们预定的工作。我正在为他们使用 std::thread

不幸的是,当我终止应用程序线程时,阻止它退出。在 C# 中,我可以将一个线程设置为 background,这样它将在应用程序退出时终止。在我看来,equavalint 功能在 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++ - std::condition_variable 没有锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38999965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com