原始双重检查锁定模式的问题已得到充分证明:C++ 和双重检查锁定的风险。我经常看到这个话题出现在关于 SO 的问题中。
我想出了一个版本,在我看来,它似乎解决了原始模式的竞争条件问题,但你觉得还可以吗?
在下面的代码中,我假设 LOCK 是正确实现的互斥锁类型,它会在锁定/解锁时导致内存屏障,并且我不会尝试处理实例的释放,因为这不是模式的一部分。
我知道做单例的其他可能方法,但这不是我要的。我特别询问模式 - 是否通过在互斥锁之外进行分配来解决竞争条件?
template <typename T, typename LOCK>
class Singleton
{
private:
static T * instance_;
static LOCK mutex;
// private - inaccessible
Singleton();
Singleton(const Singleton &);
Singleton & operator=(const Singleton &);
public:
static T * get_instance()
{
if (instance_ == NULL)
{
T * temp = new T;
mutex.lock();
if (instance_ == NULL)
instance = temp;
else
delete temp;
mutex.unlock();
}
return instance_;
}
};