атомарное хранилище нагрузки с порядком памяти

Сначала поток A запускает x.store(1, std::memory_order_release), затем поток B запускает x.load(std::memory_order_acquire). x в потоке B не гарантируется чтение 1, сохраненного A.

Если я использую memory_order_seq_cst, будет ли он гарантированно читать 1?


person Derek Zhang    schedule 22.10.2018    source источник


Ответы (2)


Поток A сначала запускает x.store (1, std :: memory_order_release), затем поток B запускает x.load (std :: memory_order_acquire).

Как узнать, что один поток выполнял операцию за другим?

По сути, путем тестирования общего состояния? Как атомный?

Таким образом, способ определить, верна ли гипотеза, будет ... проверить вывод: "прочитано 1, сохранено A" истинным или ложным.

Таким образом, вопрос читается в точности как тавтология (если x равно 2 + 2, x равно 2 + 2) или цикличность.

person curiousguy    schedule 15.11.2019

Нет никакой разницы между порядком памяти в отношении загрузки / сохранения одной атомарной переменной. Это связано с тем, что std::memory_order указывает, как обращения к памяти, включая обычные, неатомарные обращения к памяти, должны быть упорядочены вокруг атомарной операции.

Для получения полной информации прочтите std :: memory_order. Особенно:

Все модификации любой конкретной атомарной переменной происходят в общем порядке, специфичном для этой атомарной переменной.

person Maxim Egorushkin    schedule 22.10.2018
comment
как регулярные, неатомарные обращения к памяти должны быть упорядочены вокруг атомарной операции Только неатомарные операции? - person curiousguy; 12.12.2019