我想知道这段代码是否正常:
#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
在它被提交到内存之前访问。