【问题标题】:Thread safety SingletonHolder performance?线程安全SingletonHolder 性能如何?
【发布时间】:2013-10-29 07:07:37
【问题描述】:

在 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;
}

问题是这种方法总是使用互斥体来确保在多线程环境中创建的单例对象不超过一个。我认为在第一次调用方法时进行同步是合适的。如果我们在此之后进行同步,它将浪费资源。我知道Double check locking 可以解决这个问题,但它可能是broken

我的问题是 POCO 是否宁愿确保多线程环境中的安全而不是节省资源?

【问题讨论】:

  • 不要使用单例,你永远不会遇到与单例相关的任何问题。
  • 任何关于某个构造的性能的问题都应始终以“您是否针对您的用例进行了测量?”来回答。你有吗?

标签: c++ multithreading poco


【解决方案1】:

跟随你的想法没有什么能阻止你使用它:

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

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

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

你总是有锁开销。

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

【讨论】:

    猜你喜欢
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多