Считаются ли методы блокировки и разблокировки объекта-мьютекса модификациями объекта?C++

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

Сообщение Anonymous »

[thread.mutex.requirements.mutex.general] p4 говорит

В целях определения существования гонки данных они ведут себя как атомарные операции ([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
Если в [thread.mutex.requirements.mutex.general] не указано, что операции разблокировки и блокировки являются модификациями, как здесь могут применяться [intro.races] p11 ~ p14 для определения позиции соответствующих операций в порядке модификации мьютекса, чтобы сделать вывод, что unlock_in_A < unlock_in_C < lock_in_B является недопустимым общим порядком?
Обновление
Чтобы прояснить суть проблемы, рассмотрим этот пример

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

#include 

std::mutex m;
int main(){
m.lock(); // #1
m.unlock(); // #2
}
Где в текущем стандарте формулировка, которая определяет единый общий порядок m как #1 < #2, а не #2 < #1? Как отметил @PeterCordes, объект типа мьютекса даже не определен как «атомарный объект», поэтому [intro.race] p11-p14 здесь даже не может применяться для указания порядка в общем порядке. Не говоря уже о том, что неясно, являются ли lock и unlock модификациями.


Подробнее здесь: https://stackoverflow.com/questions/798 ... cations-to
Ответить

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

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

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

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

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