【问题标题】:Synchronization after thread end线程结束后的同步
【发布时间】:2011-02-25 15:22:45
【问题描述】:

由于this 的部分问题没有得到解决,我将其作为一个单独的问题:

#include<iostream>
#include<thread>
using namespace std;

void f2(double* ret) {
   *ret=5.;
}

int main() {
   double ret=0.;
   thread t2(f2, &ret);
   t2.join();
   cout << "ret=" << ret << endl;   
}

这个程序数据竞争免费吗?
对于新的 C++ 内存模型,是否可以保证从线程 t2 和线程 main 访问变量 ret 是同步的?

我的意思是,如果程序在同一个内核上执行,来自t2main 的访问显然不会发生冲突。
但是如果t2main 在不同的内核上执行呢?
是否保证核心的缓存在main 继续执行之前会同步?

如果有人能提供相同的参考资料,我将不胜感激。

谢谢。

【问题讨论】:

  • 这里没有隐式同步。 join 是线程之间的显式同步。
  • 好的,我改了标题。

标签: c++ multithreading c++11 race-condition


【解决方案1】:

您的程序没有数据竞争。 [thread.thread.member]/p5 用 Synchronization 段落描述了 join():

同步:*this表示的线程完成同步 与 (1.10) 对应的成功 join() 返回。 [注意:*this 上的操作不同步。 ——尾注]

(1.10) 指的是 [intro.multithread],这是一个太长而无法引用的部分,但对短语“同步”进行了极其详细的定义。

最新的工作草案是N3225

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2014-04-30
    相关资源
    最近更新 更多