此代码是否正确同步?
Is this code correctly synchronized?
请问这段代码好不好:
#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
应该受到同步机制的保护,但我的同事说没有必要。
EDIT:澄清我的问题:我担心 Foo()
的构造函数中的 STORE 操作发生在其他线程的 LOAD 操作之后。我看不出是什么机制阻止编译器按此顺序执行这些指令。
EDIT:我相信热心的编译器会决定内联构造函数,并将 CALL 操作之后的 STORE 操作延迟到 std::async
。在这种情况下,第二个线程可以在提交到内存之前访问 m_a
。
是的,这是正确同步的。
来自 async
的规范,C++11 30.6.8/5:
the invocation of async
synchronizes with the invocation of f
.
其中 f
是 async
的函数参数(您的示例中的 lambda)。
f.m_a
的初始化在调用 async
之前排序,因此在异步函数进行任何访问之前排序。
此外,
the completion of the function f is sequenced before the shared state is made ready.
因此访问必须在调用 get()
returns 之前发生,因此在对象被销毁之前发生。
请问这段代码好不好:
#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
应该受到同步机制的保护,但我的同事说没有必要。
EDIT:澄清我的问题:我担心 Foo()
的构造函数中的 STORE 操作发生在其他线程的 LOAD 操作之后。我看不出是什么机制阻止编译器按此顺序执行这些指令。
EDIT:我相信热心的编译器会决定内联构造函数,并将 CALL 操作之后的 STORE 操作延迟到 std::async
。在这种情况下,第二个线程可以在提交到内存之前访问 m_a
。
是的,这是正确同步的。
来自 async
的规范,C++11 30.6.8/5:
the invocation of
async
synchronizes with the invocation off
.
其中 f
是 async
的函数参数(您的示例中的 lambda)。
f.m_a
的初始化在调用 async
之前排序,因此在异步函数进行任何访问之前排序。
此外,
the completion of the function f is sequenced before the shared state is made ready.
因此访问必须在调用 get()
returns 之前发生,因此在对象被销毁之前发生。