CPP Reference个州std::call_once
是线程安全的:
即使从多个线程调用,也只执行一次函数f。
如果代码在具有多个物理处理器的计算机上运行(而不是具有多个核心的单个处理器),我是否需要在使用延迟初始化时使用内存屏障?例如:
static Foo& GetFooRef()
{
static std::once_flag flag;
static Foo foo;
MEMORY_BARRIER();
std::call_once(flag, []() {
Foo f = ...;
foo.swap(f);
});
MEMORY_BARRIER();
return foo;
}
MEMORY_BARRIER()
_ReadWriteBarrier()
for MSVC,__asm__ __volatile__ ("" ::: "memory")
代表GCC,__memory_barrier()
适用于ICC等答案 0 :(得分:8)
是的,这是call_once
的重点。线程安全意味着在具有共享内存的普通机器上的相同或不同处理器上。