pthreads诉SSE弱记忆排序

use*_*586 9 multithreading sse pthreads atomic memory-fences

x86_64上的Linux glibc pthread函数是否作为弱有序内存访问的范围?(pthread_mutex_lock/unlock是我感兴趣的确切函数).

SSE2提供了一些具有弱内存排序的指令(特别是非临时存储,例如movntps).如果您正在使用这些指令并希望保证另一个线程/核心看到一个排序,那么我理解您需要一个明确的栅栏,例如,一个sfence指令.

通常,您确实希望pthread API适当地充当栅栏.但是,我怀疑x86上的正常C代码不会产生弱有序的内存访问,所以我不相信pthreads需要充当弱有序访问的栅栏.

通过glibc pthread源代码读取,最后使用"lock cmpxchgl"实现互斥,至少在无争用路径上.所以我猜我需要知道的是,该指令是否为SSE2弱有序访问的栅栏?

Ant*_*ton 4

非临时商店需要sfence指令才能正确订购。

然而,简单互斥体的高效用户级实现假设它是通过简单的写入释放的,这并不意味着写入缓冲区刷新,这与原子读取-修改-写入操作(例如意味着lock cmpxchg完整的内存栅栏)相反。

因此,您会遇到这样的情况:应用于非时间存储unlock的语义没有效果。store-with-release因此,这些 SSE 存储可以在解锁后和另一个线程获取互斥锁后重新排序。