LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

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

я посмотрел как там сделано у гсс и цланга. в принципе - достаточно эффективно.

псевдокоод

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

то есть если переменная уже инициализирована, захват мьютекса не нужен.

а проблема, что проверка флага делается не под мьютексом и два треда могут вместе попытаться инициализировать обьект решается повторной проверкой флага после захвата мьютекса.

Исходная версия alysnix, :

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

я посмотрел как там сделано у гсс и цланга. в принципе - достаточно эффективно.

псевдокоод

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

то есть если переменная уже инициализирована, захват мьютекса не нужен.

а проблема, что проверка флага делается не под мьютексом и два треда могут вместе попытаться инициализировать обьект решается повторной проверкой флага после захвата мьютекса.