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