Может ли правило согласованности чтения-чтения определить порядок модификации в соответствии с прочитанным значением?C++

Программы на C++. Форум разработчиков
Anonymous
 Может ли правило согласованности чтения-чтения определить порядок модификации в соответствии с прочитанным значением?

Сообщение Anonymous »

[intro.races] p16 говорит:

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

Это правило обычно интерпретирует этот пример

Код: Выделить всё

std::atomic x{0};
// thread 1:
x.store(1); // #1
x.store(2); // #2

// thread 2:
x.load(); // #3
x.load(); // #4
Согласно [intro.races] стр.15, #2 следует за #1 в порядке модификации x, а если #3 читается как 1, #4 может быть 1 или 2 согласно [intro.races] стр. 16. В этом случае подчеркнутое предложение «где» накладывает требование: если B не читает X, он должен прочитать некоторый побочный эффект, следующий за X в порядке модификации.
Однако рассмотрим следующий пример:

Код: Выделить всё

std::atomic x{0};
// thread 1:
x.store(3);  // #1
//thread 2:
x.store(4);  // #2
//thread 3:
x.load();  // #3
x.load();  // #4
Если #3 читается 3, а #4 читается 4, можем ли мы сделать вывод, что 4 следует за 3 в порядке модификации согласно [intro.races] стр.16? IIUC, текущая формулировка (т.е. предложение «где») не означает, что она определяет порядок Y, другими словами, она не говорит что-то вроде: если B читает Y, то Y< /code> следует за X в порядке модификации.
Интересно, можно ли использовать правило согласованности чтения-чтения для определения порядка модификации для второго примера.

Обновление

Как здесь работает логика предложений, позволяющая рассуждать в обратном направлении от наблюдаемого поведения к порядку модификации[/b]?< /п>

Подробнее здесь: https://stackoverflow.com/questions/790 ... g-to-the-r

Вернуться в «C++»