單線程實現線程安全嗎? :: 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