Double Check 模式(双重检查锁定)在 C++ 多线程环境下依然可能引发潜在的竞态条件。虽然在大多数情况下这种做法能按预期工作,但并不能从根本上消除问题。
通常做法
通常做法
Test*getInstance()
{
if (ins == nullptr)
{
m.lock();
if (ins == nullptr)
{
ins = new Test;
}
m.unlock();
}
return ins;
}
C++11 的方案
C++11 提供了另一种方式,由运行时来保证线程安全:std::call_once 与 std::once_flag。