6

我正在使用 Visual Studio 2012 和 C++11。我不明白为什么这不起作用:

void client_loop(bool &run)
{
    while ( run );
}

int main()
{
    bool running = true;
    std::thread t(&client_loop,std::ref(running));

    running = false ;
    t.join();
}

在这种情况下,线程循环t永远不会结束,但我明确设置runningfalse. run并且running有相同的位置。我试图设置running为单个全局变量,但没有任何反应。我也尝试传递一个指针值,但什么也没有。

线程使用相同的堆。我真的不明白。谁能帮我?

4

2 回答 2

11

您的程序具有Undefined Behavior,因为它在running变量上引入了数据竞争(一个线程写入它,另一个线程读取它)。

您应该使用互斥锁来同步访问,或者running进行atomic<bool>

#include <iostream>
#include <thread>
#include <atomic>

void client_loop(std::atomic<bool> const& run)
{
    while (run.load());
}

int main()
{
    std::atomic<bool> running(true);
    std::thread t(&client_loop,std::ref(running));

    running = false ;
    t.join();

    std::cout << "Arrived";
}

看一个实际工作的例子

于 2013-03-11T00:11:35.150 回答
0

const可能不会影响编译器对代码的看法。在单线程应用程序中,该值不会改变(并且这个特定程序毫无意义)。在多线程应用程序中,由于它是原子类型,编译器无法优化负载,所以实际上这里没有真正的问题。这实际上更多是风格问题。由于main修改了值并client_loop查找该修改,因此我认为该值是const.

于 2013-03-11T14:47:11.040 回答