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

9
在我的应用程序中,我使用多个线程来执行一些耗时的任务,这些任务旨在在整个应用程序的持续时间内运行。我正在尝试实现一种好的、清晰的方法,在退出应用程序之前仅通过第二个线程来停止循环,以便我可以在循环后进行清理,然后关闭所有内容。
到目前为止,我想出了这种方法,但老实说,我并不是很喜欢它:
#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;
}

3
我不是它的狂热粉丝。没错,你不想成为一个支持破解方案的粉丝。 - Sergey Kalinichenko
2个回答

15

只需稍作修改,您的代码就可以正常运行:

std::atomic<bool> stop_flag;

7
从多个线程读取和写入同一个未同步变量无论如何都是未定义行为。无论您喜欢与否,编译器可能会优化检查并且循环可能永远不会开始或永远不会结束。
正如之前回答的那样,您可以使用std :: atomic_bool。我不喜欢全局执行此操作 - 将其作为“取消标记”传递给foo函数。
void foo(std::atomic_bool& cancellation_token)
{
    while(!cancellationToken)
    {
        //do something
    }
    clean_after();
}

我必须说,在这种情况下,将其传递给foo的想法对我来说看起来更好。 - sebap123
将其作为参数传递会使线程难以从多个位置停止。 - Pete Becker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接