// 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
, верно?
🤔 А знаете ли вы, что...
C++ был разработан в начале 1980-х годов Бьярном Страуструпом в Bell Labs.
Давайте еще раз посмотрим на это предложение:
Если операция 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.