Является ли операция чтения-изменения-записи единой неделимой операцией?C++

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

Сообщение Anonymous »


В этом комментарии к вопросу CWG говорит Йенс Маурер

Чтение-сравнение-запись — это единая неделимая операция («атомарно»).

Однако, как обсуждалось в разделе
[*]Для целей упорядочения атомарное чтение-изменение-запись — это одна операция или две? [*]Могут ли операции чтения в `compare_exchange_strong` в разных двух потоках читать одно и то же значение?
Несмотря на то, что у нас не было 100% подтвержденных ответов, мы, похоже, считаем, что операция чтения-изменения-записи состоит из двух операций: операций чтения и записи, что также подразумевается этой формальной формулировкой [atomics.order] стр10

Атомарные операции чтения-изменения-записи всегда должны читать последнее значение (в порядке модификации), записанное перед записью, связанным с операцией чтения-изменения-записи.

В формулировке упоминаются операции «чтение» и «запись», связанные с операцией чтения-изменения-записи. Однако Йенс считает, что операция чтения-изменения-записи — это единая неделимая операция.

Что здесь означает намерение в стандарте?
Обновить
Соответствующий пример:

std::atomic x{0}; // Поток 1: ожидается int = 0; x.compare_exchange_strong(expected,1,std::memory_order​::​release,std::memory_order​::relaxed); // №1 // Поток 2: ожидается int = 1; пока( /*#2*/ x.compare_exchange_strong(expected,2,std::memory_order​::acquire,std::memory_order​::relaxed) ){} При условии, что операция RMW в потоке 2 считывает значение, записанное операцией RMW в потоке 1 (т. е. #2 выполняет только одну итерацию)

[atomics.order] p2 говорит:

Атомарная операция A, которая выполняет операцию освобождения над атомарным объектом M, синхронизируется с атомарной операцией B, которая выполняет операцию получения над M и принимает ее значение из любого побочный эффект в последовательности высвобождения, возглавляемой буквой А.

[atomics.order] p1 говорит:

memory_order​::​release, Memory_order​::​acq_rel и Memory_order​::​seq_cst: операция сохранения выполняет операцию освобождения в затронутой ячейке памяти.

memory_order​::​acquire, Memory_order​::​acq_rel и Memory_order​::​seq_cst: операция загрузки выполняет операцию получения в затронутой ячейке памяти.

Это означает, что если A — операция сохранения, а B — операция загрузки, и они удовлетворяют [atomics.order] p2, то они синхронизируются.
>
IIUC #1 синхронизируется с #2, однако #1 и #2 являются операциями RMW , Является ли #1 операцией сохранения, выполняющей операцию освобождения, а #2 – операцией загрузки, выполняющей операцию получения?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как реализовать принцип единой ответственности с помощью RabbitMQ?
    Гость » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Гость
  • Как подойти к принципу единой ответственности?
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Что такое «ответственность» в принципе единой ответственности?
    Anonymous » » в форуме C#
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как подойти к принципу единой ответственности?
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Филамента: как связать каждый входной текст ниже с единой радиопроизводительной кнопкой, когда он выбран
    Anonymous » » в форуме Php
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

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