std :: thread c ++。更多线程相同的数据

时间:2013-03-10 23:57:46

标签: c++ multithreading c++11 heap std

我正在使用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的循环永远不会结束,但我明确地将running设置为falserunrunning具有相同的位置。我试图将running设置为单个全局变量,但没有任何反应。我试图传递一个指针值,但没有。

线程使用相同的堆。我真的不明白。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:11)

您的程序有未定义的行为,因为它在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";
}

查看有效的live example

答案 1 :(得分:0)

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