在下面的单例模式的'get'函数中,其他线程是否可以看到
如果可以,为什么?是什么原理?
我知道没有任何东西可以“离开”acquire-release部分,但是
我知道在C ++中实现线程安全的单例不需要使用这些复杂的技术,是的,
instance
不为null,但是almost_done
仍然为false?(假设almost_done
最初为false
。)Singleton *Singleton::Get() {
auto tmp = instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
if (tmp == nullptr) {
std::lock_guard<std::mutex> guard(lock);
tmp = instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton();
almost_done.store(true, std::memory_order_relaxed); // 1
std::atomic_thread_fence(std::memory_order_release);
instance.store(tmp, std::memory_order_relaxed); // 2
}
}
return tmp;
}
如果可以,为什么?是什么原理?
我知道没有任何东西可以“离开”acquire-release部分,但是
2
不能进入并与1
重排序吗?我知道在C ++中实现线程安全的单例不需要使用这些复杂的技术,是的,
almost_done
没有太多意义,这纯粹是为了学习。