单线程实现线程安全吗? :: Instance方法应该是正确的,Dispose是我自己创建的,所以想确保我没有忽略任何东西。单线程实现线程安全吗?
std::atomic<S *> S::_instance;
std::mutex S::_singleton_mutex;
S& S::Instance()
{
using namespace std;
S * tmp = _instance.load(memory_order_relaxed);
atomic_thread_fence(memory_order_acquire);
if (tmp == nullptr)
{
lock_guard<mutex> l(_singleton_mutex);
tmp = _instance.load(memory_order_relaxed);
if (tmp == nullptr)
{
tmp = new S();
atomic_thread_fence(memory_order_release);
_instance.store(tmp, memory_order_relaxed);
}
return *tmp;
}
void S::Dispose()
{
using namespace std;
S * tmp = _instance.load(memory_order_relaxed);
atomic_thread_fence(memory_order_acquire);
if (tmp != nullptr)
{
lock_guard<mutex> l(_singleton_mutex);
tmp = _instance.load(memory_order_relaxed);
if (tmp != nullptr)
{
atomic_thread_fence(memory_order_release);
_instance.store(nullptr, memory_order_relaxed);
delete tmp;
}
}
}
'Instance'与[Double-checked_locking](https://en.wikipedia.org/wiki/Double-checked_locking)中提供的相同,应该是正确的。 – Jarod42
顺便说一句,删除空指针是有效的。 – Jarod42
@ Jarod42大声笑感谢的人,我完全忘记了这一点:D我认为这是足够安全的使用在我的情况..所以处置可以简化删除_instance.load(..); ? – Paladin