Является ли операция чтения-изменения-записи единой неделимой операцией? ⇐ C++
Является ли операция чтения-изменения-записи единой неделимой операцией?
В этом комментарии к вопросу 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 – операцией загрузки, выполняющей операцию получения?
В этом комментарии к вопросу 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 – операцией загрузки, выполняющей операцию получения?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение