澄清pthread互斥体所涉及的全内存障碍

时间:2012-06-12 13:23:49

标签: synchronization pthreads mutex memory-fences

我听说在处理互斥锁时,必要的内存屏障由pthread API本身处理。我想了解更多有关此事的细节。

  1. 这些说法是否属实,至少在最常见的架构上是什么?
  2. 编译器是否识别此隐式屏障,并避免在生成代码时重新排序操作/从本地寄存器读取?
  3. 何时应用了内存屏障:成功获取互斥锁后和释放后?

1 个答案:

答案 0 :(得分:3)

POSIX规范列出了必须"synchronize memory with respect to other threads"的功能,其中包括pthread_mutex_lock()pthread_mutex_unlock()等功能。

Appendix A.4.11中,拼写出“同步记忆”的功能:

  • ...必须由高级编译系统识别,以便内存操作和对这些函数的调用不会通过优化重新排序;以及

  • ...可能必须添加内存同步指令,具体取决于特定的计算机。

永远不会明确指出隐含哪种内存同步指令 - 隐式规范是如果你使用一对“同步指令”来确保一个线程中的读取必须在另一个线程中写入之后发生,那么你的程序将正常运行。这包括编译器和架构重新排序效果。