В структуре 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 лучше обеспечивать безопасность в многопоточной среде, чем сохранять ресурсы?
После ваших мыслей ничто не мешает вам использовать его так:
MySingleton* s = mySingletonHolder.get();
s->doSomething(); //no locking
...
s->doSomething(); //no locking
Очевидно, что если вы его всегда используете:
mySingletonHolder.get()->doSomthing();
...
mySingletonHolder.get()->doSomthing();
Вы всегда будете иметь накладные расходы на блокировку.
BTW. Если вы используете экземпляр singleton в многопоточном сценарии, вы должны гарантировать, что вызов doSomething() является потокобезопасным. Выполнение только mySingletonHolder.get() → doSomthing(); не гарантируйте это.