停止不同线程中的无限循环

sebap123

在我的应用程序中,我正在使用多个线程来执行一些耗时的任务,该任务旨在在应用程序的整个持续时间内运行。我想要实现的是一种不错的,干净的方法,可以在退出应用程序之前杀死第二个线程中的循环,因此我可以在循环后进行清理,然后关闭所有内容。

到目前为止,我已经提出了这种方法,但是老实说,我并不是它的忠实拥护者:

#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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章