Re[5]: Порядок создания объектов
От: vdimas Россия  
Дата: 05.11.04 07:34
Оценка:
Здравствуйте, 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


Автору топика — бери как решение.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.