gpt4 book ai didi

c++ - 如何正确等待线程中的信号

转载 作者:行者123 更新时间:2023-11-28 00:06:42 28 4
gpt4 key购买 nike

我有一个类似这样的代码:

#include  <atomic>
#include <thread>
#include <iostream>

class MyClass
{
std::thread * m_thread;
std::atomic_bool m_go;
public:
MyClass()
{
m_thread = nullptr;
}
void start()
{

m_go = false;

m_thread= new std::thread([&]()
{
try
{
std::cout << "waiting" << std::endl;

while (!m_go)
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
std::cout << "Gone!" << std::endl;

}
catch (...)
{
std::cout << "some error happens" << std::endl;
}
});
}
void letsGo()
{
m_go = true;
}
void WaitToFinish()
{
if (!m_thread)
{
// thread not started or no thread is available
return ;
}

m_thread->join();

// thread finished, so delete thread and return false;
delete m_thread;
m_thread = nullptr;

}
};




int main()
{
MyClass myclass;
std::cout << "starting my class !" << std::endl;
myclass.start();

std::this_thread::sleep_for(std::chrono::seconds(10));
std::cout << "lets my class go!" << std::endl;

myclass.letsGo();

myclass.WaitToFinish();

}

MyClass 实现了一个执行某些工作的线程,但它需要等待其他一些操作的发生。

使用 MyClass 的代码将首先启动它,然后通过调用方法(在本例中为 Go())向它发出可以继续的信号。

此代码有效,但我正在寻找更好的解决方案:1- 代码使用效率低下的循环等待信号。2- 我不确定等待读取和写入 m_go 是否是执行此操作的有效方法。

实现这个类的最佳方式是什么?

我可以使用 Boost,如果这有助于更好地实现它的话。

最佳答案

准备花一天左右的时间学习所有关于 std::mutexstd::condition_variable 的知识。

通常,这是实现线程等待直到它接收到某种外部信号的标准方法。

您将在 http://www.google.com 上获得有关互斥锁和条件变量的所有信息。

关于c++ - 如何正确等待线程中的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314667/

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