Ленивая инициализация на статических локальных данных

У меня есть следующий код (часть его была опущена для простоты)

заголовок:

class DbgModuleMarker
{
public:
DbgModuleMarker( std::string name );

static std::ostream createStream( const DbgModuleMarker& marker );

std::ostream& operator()() const;

};

extern DbgModuleMarker PHYSICS;

источник:

std::ostream& DbgModuleMarker::operator()() const
{
static std::ostream os = createStream( *this );
return os;
}

цель этого кода состоит в том, чтобы operator() использоваться следующим образом

debug_modules::PHYSICS() << "Foo" << endl;

Я действительно понятия не имею, как ведет себя static, когда функция вызывается таким образом.

Я бы ожидал функцию createStream будет вызван только один раз (или никогда не будет вызван, если operator() никогда не называется

Я хотел бы знать, произойдет ли ожидаемое поведение, и будет ли это хорошей идеей, или я делаю что-то очень неправильно, не замечая этого.

Какое влияние на безопасность потоков и исключений безопасности?

(подумайте, что созданный поток сам по себе будет потокобезопасным, потому что безопасность потока std :: ostream здесь не моя задача)

2

Решение

Согласно стандарту, инициализация статических членов, определенных в области действия функции, происходит только один раз.

    static std::ostream os = createStream( *this ); // initialized only once

Кроме того, это потокобезопасно, если вы используете C ++ 11.

Просьба взглянуть на эти обсуждения:

1) потокобезопасность локальной статической инициализации в C ++ 11.

2) Инициализация статических переменных.

Если вы не используете C ++ 11, то оператор () не является потокобезопасным

 static std::ostream os = createStream( *this ); // if not C++11, this is not thread-safe and must be guarded.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]