Построение при первом использовании и принудительной инициализации для решения проблемы статического порядка инициализацC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Построение при первом использовании и принудительной инициализации для решения проблемы статического порядка инициализац

Сообщение Anonymous »

Известно, что проблему статического порядка инициализации (SIOF) можно решить, используя идиому конструкции при первом использовании (COFU). Однако это решение может привести к возникновению проблемы с условиями гонки, когда переменная инициализируется из нескольких потоков.
Я пытался избежать как SIOF, так и условий гонки в своем проекте следующим образом. Я использовал КОФУ. И я принудительно инициализировал целевую переменную, используя нелокальную переменную (c_unusedNonLocal) в C++.
Таким образом, благодаря c_unusedNonLocal, даже если нет нелокальных переменных, которые обращаются к целевой переменной через B::getA, она все равно инициализируется. Что важно, он инициализируется перед main в одном потоке. Таким образом, при доступе только для чтения не должно быть никаких состояний гонки и никакого SIOF.
Это осуществимое решение? Есть ли какие-то подводные камни, или я ошибаюсь насчет инициализации в одном потоке или что-то в этом роде?
Файл a.h
struct A
{
A() {}
};

Файл b.h
struct B
{
static const A& getA();
};

Файл b.cpp
// Force initialization before 'main' assuming that this
// happens in a single thread (thus no race conditions)
static const A& c_unusedNonLocal = B::getA();

const A& B::getA()
{
static const A* result = new A();
return *result;
}

Файл main.cpp
int main() {
// _Read-only_ access via B::getA is now threadsafe, because
// the object is guaranteed (?) to be initialized before main
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/251 ... ialization
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»