记忆障碍和单身人士模式

时间:2016-07-11 02:46:14

标签: c++ multithreading c++11 singleton memory-barriers

我很难理解内存障碍以及为什么在以下代码中需要障碍? (摘自维基百科关于双重检查锁定)

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,也可以请某个人举例说明竞争状况吗?

0 个答案:

没有答案