此代码是否正确同步?

时间:2015-01-26 10:33:41

标签: c++ synchronization stdasync

我想知道这段代码是否合适:

#include <iostream>
#include <future>
struct Foo
{
    Foo()
        :m_a(0)
    {
    }

    int m_a;
};

int main()
{
    Foo f;
    auto handle =
        std::async( std::launch::async, 
                [](Foo* f) { std::cout << f->m_a << '\n'; } ,
                &f
              );

    handle.get();
}

我相信m_a应受同步机制保护,但我的同事说没有必要。

编辑:澄清我的问题:我担心来自Foo()的构造函数的STORE操作发生在来自另一个线程的LOAD操作之后。我看不出有什么机制阻止编译器按此顺序执行这些指令。

编辑:我相信热心的编译器可以决定内联构造函数,并将CALL操作后的STORE操作延迟到std::async。在这种情况下,第二个线程可以在将其提交到内存之前访问m_a

1 个答案:

答案 0 :(得分:1)

是的,这是正确同步的。

来自async的规范,C ++ 11 30.6.8 / 5:

  

async的调用与f的调用同步。

其中fasync的函数参数(示例中的lambda)。

f.m_a的初始化在调用async之前被排序,因此在异步函数的任何访问之前都会被排序。

此外,

  

在共享状态准备好之前,函数f的完成被排序。

所以访问必须在调用get()之前发生,因此在对象被销毁之前。