Поток безопасности производительности SingletonHolder?

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 лучше обеспечивать безопасность в многопоточной среде, чем сохранять ресурсы?

  • 0
    Не используйте синглтоны, и у вас никогда не будет проблем, связанных с синглетонами.
  • 2
    На любой вопрос, касающийся производительности определенной конструкции, всегда следует отвечать «Вы измерили ее для своего варианта использования?». У тебя есть?
Теги:
multithreading
poco

1 ответ

0

После ваших мыслей ничто не мешает вам использовать его так:

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

Очевидно, что если вы его всегда используете:

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

Вы всегда будете иметь накладные расходы на блокировку.

BTW. Если вы используете экземпляр singleton в многопоточном сценарии, вы должны гарантировать, что вызов doSomething() является потокобезопасным. Выполнение только mySingletonHolder.get() → doSomthing(); не гарантируйте это.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню