我听说有互斥体打交道时,必要的内存屏障由并行线程API本身处理。 我想对这个问题的更多细节。
- 难道这些claimings真实的,至少在各地最常见的架构?
- 该编译器识别这种隐性障碍,并避免了操作的重新排序/生成的代码时,从本地寄存器读取?
- 当应用存储器屏障:成功地获取互斥后并将其释放后?
我听说有互斥体打交道时,必要的内存屏障由并行线程API本身处理。 我想对这个问题的更多细节。
POSIX规范列出了必须功能的“相对于其他线程同步存储器” ,其包括类似功能pthread_mutex_lock()
和pthread_mutex_unlock()
在附录A.4.11它明确地表明了函数“同步记忆”:
......必须由先进的编译系统的认可,这样的内存操作和调用这些函数没有被优化重新排序; 和
...将潜在地必须具有存储器同步指令加入,这取决于特定的机器上。
这是从来没有明确规定是隐含了什么样的内存同步指令 - 隐含的规范是,如果你使用一对“同步指令”,以确保在一个线程读取必须在其他,那么你的程序写入数据后发生会正确操作。 这包括编译器和建筑重新排序的效果。