В настоящее время я пытаюсь написать потокобезопасный синглтон (по крайней мере, с точки зрения построения и разрушения), используя boost :: mutex. Я читал, что мьютекс повышения не может быть инициализирован статически (я потерял ссылку, где читал, извините), поэтому, чтобы обойти это, я попробовал это, если потокобезопасность для построения и разрушения:
static T& getInstance()
{
#ifndef STATIC_VARIABLES_ARE_THREADSAFE
boost::mutex mutex;
boost::lock_guard lock(mutex);
#endif
static T instance;
return instance;
}
это потокобезопасный, или я должен использовать boost :: call_once? Придаст ли ускорение мне какое-то преимущество в производительности по сравнению с этим подходом?
РЕДАКТИРОВАТЬ: Хорошо, моя первая идея, очевидно, была неправильной. Чтобы прояснить вопрос. Можно ли безопасно инициализировать boost :: mutex статически? Нравится:
class Singleton
{
private:
static boost::mutex m_mutex;
public:
static Singleton & getInstance()
{
boost::lock_guard lock(m_mutex);
static T instance;
return instance;
}
};
Это рабочий подход или на самом деле статически запускать boost :: mutex небезопасно (это то, что я читал)?
EDIT2: Кстати, это была ссылка http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html