Параллелизм С++ в действии

Это вопрос о порядке памяти, указанном в «параллелизме С++ в действии».

Во-первых, в листинге 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()».

Я не знаю, что означает этот абзац; где находится «последовательность выпуска»?


person 최범석    schedule 08.03.2017    source источник
comment
где "последовательность выпуска"? - в листинге 7.12 вы видите: if(ptr-›internal_count.fetch_add(count_increase, std::memory_order_release)==-count_increase) { delete ptr; } вернуть разрешение; ...   -  person SChepurin    schedule 08.03.2017
comment
я думал, что последовательность выпуска действует как цепочка. если поток A, который удаляет узел в стеке, отправляет приказ об освобождении памяти другим потокам (поток B, поток C), поток B или C получает приказ об освобождении памяти в 'ptr-›internal_count.load(std::memory_order_acquire). ) ' и снова отправляет приказ об освобождении памяти другим потокам. но я думаю, что нет причин, по которым поток B или C снова отправляет приказ об освобождении памяти. Пожалуйста, скажите мне, что не так.,   -  person 최범석    schedule 09.03.2017
comment
Ваш основной вопрос был задан и ответил здесь.   -  person Drew Dormann    schedule 28.06.2018