История изменений
Исправление alysnix, (текущая версия) :
Зачем гарды внутри, если гарантировать первый вызов, как я описал, то статик внутри будет проинициализирован корректно, а большего и не требуется.
я посмотрел как там сделано у гсс и цланга. в принципе - достаточно эффективно.
псевдокоод
проверяем флаг инициализированности обьекта.
если 1, отдаем ссылку - выходим.
захватываем некий общий мьютекс.
проверяем флаг снова, если 1 выходим (тут проверяется потому, что первая проверка флага делается не под мьютексом, для пущей эффективности)
инициализируем обьект
ставим флаг в 1
отдаем мьютекс
отдаем ссылку выходим
то есть если переменная уже инициализирована, захват мьютекса не нужен.
а проблема, что проверка флага делается не под мьютексом и два треда могут вместе попытаться инициализировать обьект решается повторной проверкой флага после захвата мьютекса.
Исходная версия alysnix, :
Зачем гарды внутри, если гарантировать первый вызов, как я описал, то статик внутри будет проинициализирован корректно, а большего и не требуется.
я посмотрел как там сделано у гсс и цланга. в принципе - достаточно эффективно.
псевдокоод
проверяем флаг инициализированности обьекта.
если 1, отдаем ссылку - выходим.
захватываем некий общий мьютекс.
проверяем флаг снова, если 1 выходим (тут проверяется потому, что первая проверка флага делается не под мьютексом, для пущей эффективности)
инициализируем обьект
ставим флаг в 1
отдаем ссылку выходим
то есть если переменная уже инициализирована, захват мьютекса не нужен.
а проблема, что проверка флага делается не под мьютексом и два треда могут вместе попытаться инициализировать обьект решается повторной проверкой флага после захвата мьютекса.