// Thread 1:
obj.store(1,Release); // #1
// Thread 2:
obj.store(2, Release); // #2
//Thread 3:
obj.load(Acquire); // #3
obj.load(Relaxed); // #4
Предположим, #3 читает значение 1 и #4 читает значение 2, можно легко сделать вывод, что:
#1происходит раньше#3, согласно[введение.расы] стр.9.1
A синхронизируется с B
#2не бывает раньше#3, согласно[введение.гонки] стр. 18
Если побочный эффект X на атомарный объект M происходит до вычисления значения B для M, то оценка B берет свое значение из X или из побочного эффекта Y, который следует за X в порядке модификации M.
#3происходит раньше#4, согласно[введение.расы] стр.10.1
A секвенируется перед B
Соедините третье условие и [intro.races] стр. 16.
Если вычисление значения A атомарного объекта M происходит до вычисления значения B для M, и A получает свое значение в результате побочного эффекта X на M, то значение, вычисленное B, является либо значением, сохраненным X, либо значением, сохраненным побочный эффект Y на M, где Y следует за X в порядке модификации M.
Мы можем сделать вывод, что побочный эффект #2 следует за #1 в порядке модификации obj.
Итак, можем ли мы сделать вывод, что #1 происходит раньше #2 согласно [intro.races] стр.15
Если операция A, которая изменяет атомарный объект M, происходит до операции B, которая изменяет M, то A находится раньше, чем B в порядке модификации M.
Мне кажется, что «А раньше, чем Б в М» — это лишь необходимое условие для того, чтобы «А произошло раньше Б», другими словами, кажется, мы не можем сделать вывод, что #1 происходит раньше #2, верно?
@PeterCordes Это опечатка. Я отредактировал свой вопрос. Интересно, можем ли мы сделать вывод, что A происходит раньше B, если мы знаем, что A находится раньше, чем B в порядке модификации согласно [intro.races] стр.15.





Давайте еще раз посмотрим на это предложение:
Если операция A, которая изменяет атомарный объект M, происходит до операции B, которая изменяет M, то A находится раньше, чем B в порядке модификации M.
Это предложение принимает форму «если X, то Y», где X означает «операции A и B модифицируют атомарный объект M, где A происходит раньше B», а Y означает «A находится раньше, чем B в порядке модификации M».
Однако логически невозможно сделать обратный вывод, т. е. «если Y, то X». Если A предшествует B в порядке модификации M, на основании одного только этого правила нельзя заключить, что A происходит раньше B.
Спасибо за Ваш ответ. По этой логике мне интересно, что является контрапозитивом [intro.races] p14, если исходное предложение принимает форму «если X, то Y», я думаю, так и должно быть: если B не происходит раньше A, то значение Вычисление B — это некое неопределённое A. Противоположность этого утверждения, IIUC, состоит в том, что: если вычисление значения B не является каким-то неопределённым A, то B не происходит раньше A, верно? «не происходит до» означает происходит после или неупорядоченно? Значит, отрицание «не происходит раньше» означает, что A происходит раньше B?
В первом абзаце: «Предположим, №1 читает значение 1, а №2 читает значение 2». Но №1 — это магазин. Вы имели в виду №3 читает
1и т. д.? Кроме того, я бы рекомендовал форматирование новых строк или маркированного списка для цитат из стандарта. Обратите внимание: поскольку все эти обращения относятся к одному и тому же объекту, порядок вышеrelaxedне имеет значения. Два хранилища относятся к разным потокам, и две загрузки одного и того же объекта в одном потоке уже должны принимать то же или более позднее значение в порядке модификации, что и последняя загрузка одного и того же объекта.