1

我想知道这段代码是否正常:

#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应该受到同步机制的保护,但我的同事说没有必要。

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

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

4

1 回答 1

1

是的,这是正确同步的。

来自asyncC++11 30.6.8/5 的规范:

的调用async与 的调用同步f

f函数参数在哪里async(示例中的 lambda)。

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

此外,

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

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

于 2015-01-26T10:38:59.717 回答