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

std::thread c++. More threads same data

本文关键字:数据 线程 c++ std 多线程      更新时间:2023-10-16

我使用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设置为单个全局变量,但没有发生任何事情。我试图传递一个指针值,但什么也没有。

线程使用同一个堆。我真的不明白。有人能帮我吗?

你的程序有未定义行为,因为它在running变量上引入了数据竞争(一个线程写它,另一个线程读它)

你应该使用互斥锁来同步访问,或者让runningatomic<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";
}

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