在POCO框架中,SingletonHodler是一个用于管理sigleton对象的模板类。获取单例对象的方法是:
S* get()
/// Returns a pointer to the singleton object
/// hold by the SingletonHolder. The first call
/// to get will create the singleton.
{
FastMutex::ScopedLock lock(_m);
if (!_pS) _pS = new S;
return _pS;
}
问题是此方法始终使用互斥锁来确保在多线程环境中不会创建多个单一实例对象。我认为在第一次调用的方法时同步是合适的。如果我们在那之后同步,它会浪费资源。我知道双重检查锁定可以解决此问题,但它可能会损坏。
我的问题是POCO是否宁愿确保多线程环境中的安全性而不是节省资源?
跟随你的想法,没有什么能阻止你使用它,比如:
MySingleton* s = mySingletonHolder.get();
s->doSomething(); //no locking
...
s->doSomething(); //no locking
显然,如果你使用它总是像:
mySingletonHolder.get()->doSomthing();
...
mySingletonHolder.get()->doSomthing();
您将始终拥有头顶上的锁。
顺便说一句,如果您在多线程场景中使用单例实例,则应保证对doSomething()的调用是线程安全的。只做mySingletonHolder.get()->doSomthing();不能保证你。