Освободить / получить семантику в отношении std :: mutex

Я читаю модель памяти C ++, определенную в n3485, и она говорит о семантике освобождения / приобретения, которая из того, что я понимаю, а также из определений дано в этом блоге:

Получить семантику это свойство, которое может применяться только к операциям, которые читать из общей памяти, будь то операции чтения-изменения-записи или обычные загрузки. Затем операция считается доступной для чтения. Получить семантику предотвратите переупорядочение памяти чтения-записи с любой операцией чтения или записи, которая следует за этим в программном порядке.

Семантика выпуска это свойство, которое может применяться только к операциям, которые записывать в общую память, будь то операции чтения-изменения-записи или обычные хранилища. Операция тогда считается записью-релизом. Семантика выпуска предотвратите переупорядочение памяти выпуска-релиза с любой операцией чтения или записи, которая предшествует этому в программном порядке.

собирается предотвратить изменение порядка чтения / записи до или после текущей операции чтения / записи. Первое (приобретение) будет гарантировать, что текущее чтение не переупорядочивается с какой-либо последующей записью чтения / записи, второе (выпуск) будет гарантировать, что текущая запись не переупорядочивается с операциями чтения / записи, которые предшествуют Это.

Теперь можно сказать, что std::mutex::lock буду иметь приобретать семантика и что std::mutex::unlock по сути имеет релиз семантика?

В стандарте я могу найти это в разделе

30.4.1.2 Типы мьютекса [thread.mutex.requirements.mutex]

11 Синхронизация: до unlock() операции над тем же объектом должны синхронизировать с (1.10) эта операция.

Из того, что я понимаю синхронизировать с явно не определено в стандарте, однако, похоже, это тип происходит раньше Отношение, рассматривающее два оператора, оцениваемые между двумя разными потоками, однако, исходя из моего понимания семантики получения / выпуска, это больше связано с переупорядочением памяти. синхронизировать с также можно назвать семантикой релиз / приобретение?

Итак, применима ли семантика освобождения / приобретения не только к переупорядочению операций загрузки / сохранения, а также к чередованию операций внутри потока?

В стандартном разделе о модели памяти в основном говорится о упорядоченных отношениях с точки зрения чередования двух потоков. Это оставляет открытым для интерпретации относительно того, относится ли это также к упорядочению памяти.

Кто-нибудь может уточнить?

7

Решение

Теперь можно сказать, что std :: mutex :: lock будет приобретать семантику, а std :: mutex :: unlock по существу имеет семантику освобождения?

да, это правильно.

Из того, что я понимаю синхронизировать с явно не определено в стандарте

Ну, в теории пункт 1.10 / 8, вероятно, предназначен для определения синхронизируется с:

Определенные вызовы библиотеки синхронизировать с другие вызовы библиотеки, выполняемые другим потоком. Например,
атомный магазин-релиз синхронизируется с получение нагрузки, которое берет свое значение из магазина (29.3). [Заметка: …]

С другой стороны, это не звучит как очень формальное определение. Тем не менее, лучший, хотя и неявный, косвенно дается в пункте 1.10 / 10:

Оценка А является упорядоченный по зависимости оценка B, если

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

— для некоторой оценки X, A упорядочен по зависимости, прежде чем X и X несет зависимость к B.

[ Заметка: Отношение «упорядочено по зависимости раньше» аналогично «синхронизируется с», но использует release / —
потреблять вместо выпуска / приобретения.
—Конечная записка]

С тех пораналогично«отношения чаще всего симметричны, я бы сказал, что приведенное выше определение»упорядоченный по зависимости«косвенно дает определение»синхронизируется с«также — хотя вы могли бы правильно возразить, что примечания ненормативны; тем не менее, это, кажется, намеченное определение.

Моя интуиция синхронизируется с связь заключается в том, что это происходит между операцией записи (атомарной), выполняемой одним потоком, который хранит определенное значение, и первый (атомарная) операция, которая читает это значение. Эта операция также может быть в том же потоке.

Если две операции выполняются в разных потоках, то синхронизирует-с Отношение устанавливает поперечный порядок операций.

В стандарте я могу найти это в разделе

30.4.1.2 Типы мьютекса [thread.mutex.requirements.mutex]

11 Синхронизация: до unlock() операции над тем же объектом должны синхронизировать с (1.10) эта операция.

Мне это кажется совместимым с приведенной выше интерпретацией. Операция с семантикой освобождения (разблокировка, сохранение) будет синхронизирована с операцией получения семантики (блокировка, загрузка).

однако, исходя из моего понимания семантики получения / выпуска, это больше связано с переупорядочением памяти. синхронизировать с также можно назвать семантикой релиз / приобретение?

Освобождение и приобретение семантики описывают природу некоторых операций; синхронизирует-с отношения (действительно) отношения который устанавливается между операциями, которые получают или освобождают семантику, в четко определенной форме.

Так что в некотором смысле, синхронизирует-с является следствием семантики этих операций, и мы используем эту семантику для достижения правильного упорядочения команд и ограничения возможного переупорядочения, которое будет выполнять ЦП или компилятор.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]