Известно, что проблему статического порядка инициализации (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