此代码是否正确同步

Is this code correctly synchronized?

本文关键字:同步 是否 代码      更新时间:2023-10-16

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

#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提交到内存之前访问它。

是的,这是正确同步的。

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

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

其中f是要async的函数参数(示例中的 lambda)。

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

此外

函数 f 的完成在共享状态准备就绪之前进行排序。

因此,访问必须在调用 get() 返回之前进行,因此在销毁对象之前。