0

在 POCO 框架中,SingletonHodler 是一个用于管理单例对象的模板类。获取单例对象的方法是:

    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 是否宁愿确保多线程环境中的安全而不是节省资源?

4

1 回答 1

0

按照你的想法,没有什么能阻止你像这样使用它:

   MySingleton* s = mySingletonHolder.get();
   s->doSomething(); //no locking
   ...
   s->doSomething(); //no locking

显然,如果你总是像这样使用它:

   mySingletonHolder.get()->doSomthing();
   ...
   mySingletonHolder.get()->doSomthing();

您将始终拥有锁定开销。

顺便说一句,如果您在多线程场景中使用单例实例,则应保证对doSomething()的调用是线程安全的。只做mySingletonHolder.get()->doSomthing(); 不向您保证。

于 2013-10-29T07:43:14.693 回答