Здравствуйте, MaximE, Вы писали:
ME>function static — хороший способ создания проблем в многопотоковом коде. Сегодня у тебя этот static инициализирует один поток, завтра — ?, и компилятор здесь тебе не поможет никакой диагностикой.
Интерфейс важнее реализации, IMHO.
functional static — хорошее ср-во инкапсуляции подробностей обеспечения гарантированного порядка создания объектов, в данном случае — по мере их использования друг-другом.
никто не мешает потом сделать нечто вроде:
template<typename T, T* (*unique_func)(bool) >
struct fstatic_body
{
static T* obj;
static mutex mt;
// вызываем этот метод в теле многопоточной программы
static T* get_mt() {
if(!obj) {
guard lock(mt);
if(!obj)
obj = new T();
}
return obj;
}
// вызываем этот метод в теле конструкторов глобальных объектов
static T* get() {
if(!obj)
obj = new T();
return obj;
}
~fstatic_body() { if(obj) delete obj; } // грохаем статический объект в деструкторе экземпляра :)
};
template<typename T, T* (*unique_func)(bool)>
T* fstatic_body<T, unique_func>::obj = NULL;
template<typename T, T* (*unique_func)(bool)>
mutex fstatic_body<T, unique_func>::mt;
struct SomeType {};
SomeType* get_some_obj(bool from_ctor = false) {
static fstatic_body<SomeType, get_some_obj> st;
if(from_ctor)
return st.get(); // :)
else
return st.get_mt();
}
// можно макросом подсобить
#define DEF_SGTON(type, name) \
// тут переписать ф-ию get_some_obj с подстановкой type и name
Автору топика — бери как решение.