在我的应用程序中,我正在使用多个线程来执行一些耗时的任务,该任务旨在在应用程序的整个持续时间内运行。我想要实现的是一种不错的,干净的方法,可以在退出应用程序之前杀死第二个线程中的循环,因此我可以在循环后进行清理,然后关闭所有内容。
到目前为止,我已经提出了这种方法,但是老实说,我并不是它的忠实拥护者:
#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;
}
无论如何,从多个线程读取和写入相同的未同步变量都是未定义的行为。不管是否支持,编译器可能只会优化检查,循环可能永远不会开始或永远不会结束。
如前所述,您可以使用std::atomic_bool
。我不喜欢在全球范围内使用它-将其传递foo
为“取消令牌”。
void foo(std::atomic_bool& cancellation_token)
{
while(!cancellationToken)
{
//do something
}
clean_after();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句