我正在使用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
设置为false
。 run
和running
具有相同的位置。我试图将running
设置为单个全局变量,但没有任何反应。我试图传递一个指针值,但没有。
线程使用相同的堆。我真的不明白。任何人都可以帮助我吗?
答案 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
似乎不合适。