我已经知道互斥锁也可以从这里带来作为内存屏障的效果: Can mutex replace memory barriers ,但我总是看到在 c++ 单例示例中使用内存屏障,如下所示,内存屏障是不必要的吗?
Singleton* Singleton::getInstance() {
Singleton* tmp = m_instance.load(std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_acquire);
if (tmp == nullptr) {
std::lock_guard<std::mutex> lock(m_mutex); // using mutex here
tmp = m_instance.load(std::memory_order_relaxed);
if (tmp == nullptr) {
tmp = new Singleton;
assert(tmp != nullptr);
std::atomic_thread_fence(std::memory_order_release); // using memory barrier here
m_instance.store(tmp, std::memory_order_relaxed);
}
}
return tmp;
}
最佳答案
如果可以使用C++11,则无需编写自己的保护程序。
还引用了 here ,所有需要的东西都已经是 C++11 的一部分。从那里复制:
Singleton& GetInstance() {
static Singleton s;
return s;
}
该实现将提供内存屏障或其他任何东西来保护您的并发访问。因此,请保持示例中给出的简单!关于c++ - c++ 单例在使用互斥锁时是否需要内存屏障?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64575705/