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

Stop infinite loop in different thread

本文关键字:无限循环 线程      更新时间:2023-10-16

在我的应用程序中,我使用多个线程来完成一些耗时的任务,该任务旨在在整个应用程序期间运行。我试图实现的是一些漂亮而干净的方法,在退出应用程序之前杀死第二个线程中的循环,这样我就可以在循环后清理然后关闭所有内容。

到目前为止,我已经提出了这种方法,但说实话,我不是它的忠实粉丝:

#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> stop_flag;

多个线程读取和写入同一个未同步变量无论如何都是未定义的行为。无论是否扇形,编译器可能只是优化检查,循环可能永远不会开始或永远不会结束。

如前所述,您可以使用 std::atomic_bool .我不喜欢在全球范围内这样做 - 将其作为"取消令牌"传递给foo

void foo(std::atomic_bool& cancellation_token)
{
    while(!cancellationToken)
    {
        //do something
    }
    clean_after();
}