Я пытаюсь лучше понять программирование без блокировки:
Предположим, у нас есть два потока в гонке данных:
// Thread 1
x = 1
// Thread 2
x = 2
Есть ли безблокировочный способ, которым третий поток может узнать результат гонки, не имея возможности прочитать x?
Предположим, что поток 3 использует незаблокированную очередь, и код выглядит так:
// Thread 1
x = 1
queue.push(1)
// Thread 2
x = 2
queue.push(2)
Тогда операции можно было бы расположить так:
x = 1
x = 2
queue.push(1)
queue.push(2)
or
x = 1
x = 2
queue.push(2)
queue.push(1)
Таким образом, наличия очереди без блокировки недостаточно для того, чтобы поток 3 узнал значение x после гонки.
x
, увидят, что его значение изменится не более двух раз (на1
, а затем на2
или наоборот), а не на 1, затем на 2, а затем обратно на 1. И ARM, и x86 запрещают изобретать аппаратные средства записи таким образом. На x86 и ARM я думаю, что очередь без блокировок должна будет использовать по крайней мере выпуск/получение для правильной работы, поэтому, если поток 3 действительно получает загрузки обоих элементов очереди, тогда синхронизация rel/acq означает он увидит окончательное значениеx
. то есть в качестве побочного эффекта/детали реализации очередь делает все предыдущие сохранения в потоке 1/2 видимыми для потока 3. - person Peter Cordes   schedule 23.07.2018