Pthreads v. SSE слабое упорядочение памяти
Выполняют ли функции glibc pthread Linux на x86_64 как ограждения для слабо упорядоченных обращений к памяти? (pthread_mutex_lock/unlock - это точные функции, которые меня интересуют).
SSE2 предоставляет некоторые инструкции со слабым упорядочением памяти (не временные хранилища, такие как movntps, в частности). Если вы используете эти инструкции и хотите гарантировать, что другой поток/ядро видит порядок, тогда я понимаю, что для этого требуется явный забор, например, инструкция sfence.
Обычно вы ожидаете, что API pthread будет действовать как забор соответствующим образом. Тем не менее, я подозреваю, что обычный C-код на x86 не будет генерировать слабо упорядоченные обращения к памяти, поэтому я не уверен, что pthreads должен действовать как забор для слабо упорядоченных обращений.
Чтение через исходный код glibc pthread, мьютекс в конце реализован с использованием "lock cmpxchgl", по крайней мере, на бесконтактном пути. Поэтому я предполагаю, что мне нужно знать, что эта инструкция действует как забор для слабо упорядоченных доступов SSE2?
Ответы
Ответ 1
Невременные хранилища нуждаются в инструкции sfence
для правильного упорядочения.
Однако эффективная реализация простого мьютекса на уровне пользователя предполагает, что он выпущен простой записью, которая не подразумевает сброс буферов записи, в отличие от операций с атомарным чтением-модификацией-записью типа lock cmpxchg
, которые подразумевают полное забор памяти.
Таким образом, у вас есть ситуация, когда unlock
не влияет на семантику store-with-release
, применяемую для невременных хранилищ. Таким образом, эти хранилища SSE могут быть переупорядочены после разблокировки и после того, как другой поток получит мьютекс.