我很难理解内存障碍以及为什么在以下代码中需要障碍? (摘自维基百科关于双重检查锁定)
std::atomic<Singleton*> Singleton::m_instance;
std::mutex Singleton::m_mutex;
Singleton* Singleton::getInstance() {
Singleton* tmp = m_instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire); // <- 1
if (tmp == nullptr) {
std::lock_guard<std::mutex> lock(m_mutex);
tmp = m_instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton;
std::atomic_thread_fence(std::memory_order_release); // <- 2
m_instance.store(tmp, std::memory_order_relaxed);
}
}
return tmp;
}
为什么围栏2存在?没有锁定确保对m_instance
的访问是原子的,不会受到代码重新排序的影响吗?
如果障碍被移除且m_instance
变量不是std::atomic
,也可以请某个人举例说明竞争状况吗?