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

seb*_*123 5 c++ multithreading

在我的应用程序中,我使用多个线程执行一些耗时的任务,这是为了在应用程序的整个持续时间内运行.我想要实现的是一些漂亮而干净的方法在退出app之前杀掉第二个线程中的循环,所以我可以在循环后清理然后关闭所有内容.

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ker 10

只需略微更改,您的代码就可以了:

std::atomic<bool> stop_flag;
Run Code Online (Sandbox Code Playgroud)


Dav*_*aim 5

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

如前所述,您可以使用std::atomic_bool. 我不喜欢在全球范围内执行此操作 - 将其foo作为“取消令牌”传递给。

void foo(std::atomic_bool& cancellation_token)
{
    while(!cancellationToken)
    {
        //do something
    }
    clean_after();
}
Run Code Online (Sandbox Code Playgroud)