Какой вывод можно сделать по результату атомарных операций?

// 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. #1 происходит раньше #3, согласно

[введение.расы] стр.9.1

A синхронизируется с B

  1. #2 не бывает раньше #3, согласно

[введение.гонки] стр. 18

Если побочный эффект X на атомарный объект M происходит до вычисления значения B для M, то оценка B берет свое значение из X или из побочного эффекта Y, который следует за X в порядке модификации M.

  1. #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.


83
1

Ответ:

Решено

Давайте еще раз посмотрим на это предложение:

Если операция 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.