В целях определения существования гонки данных они ведут себя как атомарные операции ([intro.multithread]). Операции блокировки и разблокировки одного мьютекса выполняются в одном общем порядке.
[Примечание 2: Это можно рассматривать как порядок модификации мьютекса.
— последнее примечание]
Порядок модификации описывает только модификации объекта в соответствии с [intro.races] p4
Все модификации конкретного атомарного объекта M происходят в определенном общем порядке, называемом порядком модификации M.
Если в [thread.mutex.requirements.mutex.general] не указано, что операции разблокировки и блокировки являются модификациями, как может [intro.races] p11 ~ p14 применяется здесь, чтобы определить положение соответствующих операций в порядке модификации мьютекса?
Чтобы прояснить суть проблемы, рассмотрим этот пример
Код: Выделить всё
#include
std::mutex m;
int main(){
m.lock(); // #1
m.unlock(); // #2
}
[thread.mutex.requirements.mutex.general] p4 говорит только, что #1 и #2 встречаются в одном общем порядке. Если нет явной формулировки, указывающей, как две операции объекта-мьютекса упорядочиваются в общем порядке m с точки зрения happens-before, согласно определению самого общего порядка, общий порядок m может быть либо #1 < #2, либо #2 < #1.
Подробнее здесь: https://stackoverflow.com/questions/798 ... cations-to
Мобильная версия