Известно, что проблему статического порядка инициализации (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
Построение при первом использовании и принудительной инициализации для решения проблемы статического порядка инициализац ⇐ C++
Программы на C++. Форум разработчиков
1762122532
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/25122575/construct-on-first-use-and-forced-initialization-to-solve-static-initialization[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия