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 могут быть переупорядочены после разблокировки и после того, как другой поток получит мьютекс.