Это вопрос о порядке памяти, указанном в «параллелизме С++ в действии».
Во-первых, в листинге 5.7; следствие может быть:
Тема А:
x.store(true, release)
Поток B:
x.load(acquire)
возвращает true,y.load(acquire)
возвращает falseПоток C:
y.load(acquire)
возвращает true,x.load(acquire)
возвращает falseТема D:
y.store(true, release)
С другой стороны, по «последовательности выпуска»:
- хранилище потока A -> x_load потока B и
- по последовательности выпуска, -> x_load потока C
- поэтому x_load потока C должен быть истинным, если y_load потока B является ложным.
Так что я думаю, что это должно быть
Поток B:
x.load(acquire)
возвращает истину,y.load(acquire)
возвращает истинуПоток C:
y.load(acquire)
возвращает true,x.load(acquire)
возвращает false
or
Поток B:
x.load(acquire)
возвращает true,y.load(acquire)
возвращает falseПоток C:
y.load(acquire)
возвращает истину,x.load(acquire)
возвращает истину
Другой вопрос:
В листинге 7.12 есть абзац,
'простой способ сделать это - заставить
fetch_add()
в ветке успешного возврата использоватьstd::memory_order_release
, аfetch_add()
в ветке повторного цикла использоватьstd::memory_order_acquire
. Тем не менее, это все еще избыточно: только один поток выполняет удаление, поэтому только этот поток должен выполнять операцию получения. К счастью, посколькуfetch_add()
– это операция чтения-изменения-записи, она является частью последовательности выпуска, поэтому вы можете сделать это с помощью дополнительногоload()
».
Я не знаю, что означает этот абзац; где находится «последовательность выпуска»?