x86_64上的Linux线程函数是否用作弱有序内存访问的栅栏?(p线程_mutex_lock/unlock正是我感兴趣的函数)。
SSE2提供了一些具有弱内存排序的指令(特别是非时态存储,例如movntps )。如果您正在使用这些指令,并且想要保证另一个线程/核心能够看到排序,那么我知道您需要一个明确的栅栏来完成这个操作,例如,一个sfence指令。
通常,您确实希望pthread能够适当地充当栅栏。但是,我怀疑x86上的普通C代码不会生成弱有序的内存访问,所以我不相信p线程需要充当弱有序访问的围栏。
通过阅读glibc线程源代码,最终使用"lock cmpxchgl“实现互斥,至少在非竞争路径上是这样。因此,我猜想我需要知道的是,该指令是否充当了SSE2弱有序访问的围栏?
发布于 2014-08-08 16:30:24
非时态存储需要正确地排序sfence指令。
然而,简单互斥体的有效用户级实现假设它是由一个简单的写释放出来的,这并不意味着写缓冲区会被刷新,而像lock cmpxchg这样的原子读-修改-写操作则意味着完全的内存隔离。
因此,当unlock没有将store-with-release语义应用于非时态存储时,您会遇到这样的情况。因此,这些SSE存储可以在解锁之后和另一个线程获得互斥之后重新排序。
https://stackoverflow.com/questions/24233959
复制相似问题