pthreads v. SSE слабое упорядочение памяти
Работают ли функции Linux glibc pthread на 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 могут быть переупорядочены после разблокировки и после того, как другой поток получит мьютекс.