gpt4 book ai didi

c++ - 如何在 sleep 时唤醒 std::thread

转载 作者:IT老高 更新时间:2023-10-28 22:32:48 44 4
gpt4 key购买 nike

我正在使用 C++11,我有一个 std::thread,它是一个类成员,它每 2 分钟向监听器发送一次信息。其他的,它只是 sleep 。所以,我让它休眠 2 分钟,然后发送所需的信息,然后再次休眠 2 分钟。

// MyClass.hpp
class MyClass {

~MyClass();
RunMyThread();

private:
std::thread my_thread;
std::atomic<bool> m_running;
}


MyClass::RunMyThread() {

my_thread = std::thread { [this, m_running] {
m_running = true;
while(m_running) {
std::this_thread::sleep_for(std::chrono::minutes(2));
SendStatusInfo(some_info);
}
}};
}

// Destructor
~MyClass::MyClass() {
m_running = false; // this wont work as the thread is sleeping. How to exit thread here?
}

问题:
这种方法的问题是我无法在线程 sleep 时退出线程。我从阅读中了解到,我可以使用 std::condition_variable 唤醒它并优雅地退出?但我正在努力寻找一个 simple example 来满足上述情况的要求。我发现的所有 condition_variable 示例对于我在这里尝试做的事情来说都太复杂了。

问题:
如何使用 std::condition_variable 唤醒线程并在其休眠时优雅退出?或者有没有其他方法可以在没有 condition_variable 技术的情况下实现相同的目标?

另外,我发现我需要将 std::mutexstd::condition_variable 结合使用?这真的有必要吗?是不是只在代码中需要的地方加上std::condition_variable逻辑就不能达到目的?

环境:
带有编译器 gcc 和 clang 的 Linux 和 Unix。

最佳答案

How can I use an std::condition_variable to wake the thread and exit gracefully while it was sleeping? Or are there any other ways of achieving the same without condition_variable technique?

不,从 C++17 开始,标准 C++ 中没有(当然有非标准的、特定于平台的方法,并且很可能会在 C++2a 中添加某种信号量)。

Additionally, I see that I need to use a std::mutex in conjunction with std::condition_variable? Is that really necessary?

是的。

Is it not possible to achieve the goal by adding the std::condition_variable logic only to required places in the code piece here?

没有。首先,您不能等待 condition_variable 而不锁定互斥体(并将锁定对象传递给等待函数),因此无论如何您都需要存在互斥体。由于无论如何您都必须有一个互斥锁,因此要求服务员和通知者都使用该互斥锁并不是什么大问题。

条件变量会受到“虚假唤醒”的影响,这意味着它们可以无缘无故地停止等待。为了判断它是因为被通知而唤醒,还是被虚假唤醒,您需要一些由通知线程设置并由等待线程读取的状态变量。因为该变量由多个线程共享,所以需要安全地访问它,而互斥锁确保了这一点。

即使您对共享变量使用原子变量,通常仍需要互斥锁以避免错过通知。

这一切在 https://github.com/isocpp/CppCoreGuidelines/issues/554

关于c++ - 如何在 sleep 时唤醒 std::thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52610776/

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