Содержит ли pthread_mutex_lock инструкцию по ограничению памяти?
Вызывают ли функции pthread_mutex_lock и pthread_mutex_unlock инструкции по ограничению / барьеру памяти? Или у инструкций нижнего уровня, таких как сравнение imp_and_swap implicity, есть барьеры памяти?
2 ответа
Вызывают ли функции pthread_mutex_lock и pthread_mutex_unlock инструкции по ограничению / барьеру памяти?
Они делают, а также создание потоков.
Однако обратите внимание, что существует два типа барьеров памяти: компилятор и аппаратное обеспечение.
Барьеры компилятора только препятствуют тому, чтобы компилятор переупорядочивал операции чтения и записи и определяли значения переменных, но не мешают процессору переупорядочивать.
Аппаратные барьеры не позволяют процессору переупорядочивать операции чтения и записи. Ограничение полной памяти обычно является самой медленной инструкцией, в большинстве случаев вам нужны только операции с семантикой получения и выпуска (для реализации спин-блокировок и мьютексов).
При многопоточности большую часть времени вам нужны оба барьера.
Любая функция, определение которой недоступно в этом модуле перевода (и не является внутренней), является барьером памяти компилятора. pthread_mutex_lock
, pthread_mutex_unlock
, pthread_create
также создайте аппаратный барьер памяти для предотвращения переупорядочения процессором операций чтения и записи.
См. C++ и Beyond 2012: Herb Sutter - атомное оружие<>;; для получения более подробной информации.
Пожалуйста, ознакомьтесь с разделом 4.11 спецификации POSIX.
Приложения должны гарантировать, что доступ к любой ячейке памяти более чем одним потоком управления (потоками или процессами) ограничен, так что ни один поток управления не может читать или изменять ячейку памяти, в то время как другой поток управления может изменять ее. Такой доступ ограничен использованием функций, которые синхронизируют выполнение потока, а также синхронизируют память относительно других потоков. [акцент мой]
Затем приводится список функций, которые синхронизируют память, а также несколько дополнительных примечаний.
Если для какой-либо архитектуры требуются инструкции по ограничению памяти, их следует использовать.
Около compare_and_swap
: это не в POSIX; проверьте документацию на то, что вы используете. Например, IBM определяет compare_and_swap
функция для AIX 5.3. который не имеет полной семантики барьера памяти
Если compare_and_swap используется в качестве блокирующего примитива, вставьте isync в начало любых критических секций.
Из этой документации мы можем догадаться, что IBM compare_and_swap
имеет семантику релиза: поскольку документация не требует барьера для конца критической секции. Процессору получения необходимо выполнить isync, чтобы убедиться, что он не читает устаревшие данные, но процессору публикации ничего не нужно делать.
На уровне команд некоторые процессоры сравнивают и меняют определенные гарантии синхронизации, а некоторые - нет.