【问题标题】:Visibility of a variable across threads in c++c++中跨线程变量的可见性
【发布时间】:2020-12-08 11:43:40
【问题描述】:

给定下面的代码,能保证看到 a 的最新值 4 吗?

int a;
mutex mtx;
void f() {
    unique_lock<mutex> lck(mtx);
    // read(a);
    // is it guarantee it will see the value 4?
}

int main() {
    a = 4;
    thread(f);
}

【问题讨论】:

  • 在全局变量的第一步值中,将设置a,一旦它创建的线程就可以看到设置的值。
  • 分配a = 4;thread(f); 生成之前完成。因此,这是有保证的。 (AFAIK,启动线程就足够同步了。)如果a 在启动线程后从未更改,则甚至不需要锁。
  • 在您的代码 sn-p 中,即使没有互斥锁也可以保证。
  • 函数定义位置不影响代码执行顺序。
  • 为什么不呢?即使没有线程,你的代码也会做同样的事情

标签: c++ multithreading


【解决方案1】:

是的,这是有保证的:

32.4.2.2 构造函数 [thread.thread.constr]

同步:构造函数的调用完成 与 f 副本的调用开始同步。

换句话说,std::thread本身的构造,发生在原来的执行线程中,与线程函数的调用开始同步。或者,换句话说:在std::thread 被构造之前发生的所有事情,在原始线程中,在线程函数中都是可见的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-03-05
    • 2021-09-20
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多