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_oncestd::once_flag