http://www.boost.org/doc/libs/1_58_0/doc/html/atomic/usage_examples.html
В примере «Синглтон с двойной проверкой шаблона блокировки» из приведенных выше примеров форсирования необходимы ли memory_order_consume для второй загрузки _instance и memory_order_release для хранения _instance? Я думал, что scoped_lock уже получил и выпустил семантику, и первая загрузка _instance имеет режим синхронизации memory_order_consume.
При условии, что 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
,