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

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.

3

Решение

При условии, что 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,

0

Другие решения


По вопросам рекламы [email protected]