【发布时间】:2012-06-15 09:25:51
【问题描述】:
我听说在处理互斥体时,必要的内存屏障由 pthread API 本身处理。我想了解有关此事的更多详细信息。
- 这些说法是否属实,至少在最常见的架构上如此?
- 编译器是否识别此隐式屏障,并在生成代码时避免重新排序操作/从本地寄存器读取?
- 什么时候应用内存屏障:在成功获取互斥体之后并在释放它之后?
【问题讨论】:
标签: synchronization pthreads mutex memory-fences
我听说在处理互斥体时,必要的内存屏障由 pthread API 本身处理。我想了解有关此事的更多详细信息。
【问题讨论】:
标签: synchronization pthreads mutex memory-fences
POSIX 规范列出了必须"synchronize memory with respect to other threads" 的函数,其中包括pthread_mutex_lock() 和pthread_mutex_unlock() 等函数。
在Appendix A.4.11 中说明了“同步内存”的功能:
...必须被高级编译系统识别,以便内存操作和对这些函数的调用不会被优化重新排序;和
...可能必须添加内存同步指令,具体取决于特定的机器。
从来没有明确指定隐含什么样的内存同步指令 - 隐含的规范是,如果您使用一对“同步指令”来确保一个线程中的读取必须发生在另一个线程中的写入之后,那么您的程序将正常运行。这包括编译器和架构重新排序效果。
【讨论】: