Поточно-безопасная ленивая конструкция синглтона в C++

По сути, вы запрашиваете application-singleton синхронизированное создание cxx синглтона без использования cpp какой-либо синхронизации singleton (ранее созданные переменные). В multithreading общем, нет, это невозможно. Вам singleton-class нужно что-то доступное для cxx синхронизации.

Что касается construction вашего другого вопроса, да, статические multithreading переменные, которые могут singleton быть статически инициализированы multithreading (т.е. не требуется код времени thread выполнения), гарантированно thread будут инициализированы до cpp выполнения другого кода. Это multithreading позволяет использовать статически application-singleton инициализированный мьютекс cxx для синхронизации создания singleton синглтона.

Из редакции стандарта lazy-initialization C++ 2003 г.:

Объекты со статической singleton-class продолжительностью хранения threading (3.7.1) должны быть инициализированы multithreading нулями (8.5) до того, как construction произойдет любая другая инициализация. Нулевая cpp инициализация и инициализация multithreading с константным выражением c++ вместе называются статической c++ инициализацией; вся остальная lazy-initialization инициализация является динамической singleton инициализацией. Объекты типов c++ POD (3.9) со статической singleton-class продолжительностью хранения, инициализированные singleton-methods с помощью константных выражений threading (5.19), должны быть инициализированы construct до того, как произойдет какая-либо threads динамическая инициализация. Объекты thread со статической продолжительностью threads хранения, определенные в construction области пространства имен cxx в той же единице трансляции thread и динамически инициализированные, должны singleton-class быть инициализированы в том singleton-methods порядке, в котором их определение lazy-initialization появляется в единице трансляции.

Если threading вы знаете, что будете использовать threads этот синглтон во время инициализации c++ других статических объектов, я cpp думаю, вы обнаружите, что singleton-class синхронизация не является construct проблемой. Насколько мне threads известно, все основные компиляторы construction инициализируют статические application-singleton объекты в одном потоке, поэтому thread безопасность потоков во время lazy-initialization статической инициализации. Вы cxx можете объявить свой одноэлементный construction указатель равным NULL, а application-singleton затем проверить, был ли он multithreading инициализирован, прежде чем cpp использовать его.

Однако это thread предполагает, что вы знаете, что construct будете использовать этот thread синглтон во время статической lazy-initialization инициализации. Это также thread не гарантируется стандартом, поэтому, если lazy-initialization вы хотите быть в полной безопасности, используйте construct статически инициализированный cxx мьютекс.

Редактировать: предложение singleton-class Криса использовать атомарное construct сравнение и обмен, безусловно, сработает. Если construct переносимость не является singleton проблемой (и создание дополнительных thread временных синглетонов не c++ является проблемой), то это application-singleton решение с немного меньшими application-singleton накладными расходами.

c++

multithreading

singleton

construction

lazy-initialization

2022-06-05T15:48:30+00:00
Вопросы с похожей тематикой, как у вопроса:

Поточно-безопасная ленивая конструкция синглтона в C++