Режим синхронизации в блоке, защищенном мьютексом

http://www.boost.org/doc/libs/1_58_0/doc/html/atomic/usage_examples.html

В примере «Singleton с дважды проверенным шаблоном блокировки» из приведенных выше примеров повышения необходимы ли memory_order_consume для второй загрузки _instance и memory_order_release для хранилища _instance? Я думал, что scoped_lock уже имеет семантику получения и освобождения, а первая загрузка _instance имеет режим синхронизации memory_order_consume.


person paper    schedule 14.05.2015    source источник


Ответы (1)


Если предположить, что используемые здесь примитивы boost поддерживают ту же функциональность, что и их аналоги std, второй load не требует memory_order_consume, поскольку он гарантированно синхронизируется с store/release на основе семантики получения/освобождения mutex, вы правы насчет это.

Возможно, использование memory_order_consume было основано на ложном предположении, что load/relaxed может переплыть барьер mutex/acquire, но это невозможно в соответствии с гарантиями mutex, и поэтому memory_order_relaxed совершенно нормально.

С другой стороны, store/release абсолютно необходим, потому что он синхронизируется с первым load/consume, который не защищен mutex.

person LWimsey    schedule 23.08.2017