在我的应用程序中,我使用多个线程进行一些耗时的任务,这个任务是在应用程序的整个持续时间内运行。我想要实现的是在退出应用程序之前在第二个线程中杀死循环的一些漂亮而干净的方法,所以我可以在循环之后清理然后关闭所有内容。
到目前为止,我已经提出了这种方法,但说实话,我并不是它的忠实粉丝:
#include <iostream>
#include <thread>
bool stop_flag;
void foo()
{
while(!stop_flag)
{
//do something
}
clean_after();
}
int main()
{
stop_flag = false;
std::thread whileThread(foo);
// app lifetime
stop_flag = true;
whileThread.join();
return 0;
}
答案 0 :(得分:10)
只需稍作修改,您的代码就可以了:
std::atomic<bool> stop_flag;
答案 1 :(得分:3)
从多个线程读取和写入相同的非同步变量无论如何都是未定义的行为。是否风扇,编译器可能只是优化检查,循环可能永远不会启动或永远不会结束。
如前所述,您可以使用std::atomic_bool
。我不是全球范围内的粉丝 - 将其作为“取消令牌”传递给foo
。
void foo(std::atomic_bool& cancellation_token)
{
while(!cancellationToken)
{
//do something
}
clean_after();
}