このコードは大丈夫かどうか疑問に思います:
#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
。この場合、2 番目のスレッドはm_a
、メモリにコミットされる前にアクセスできます。