4

我听说在处理互斥体时,必要的内存屏障由 pthread API 本身处理。我想了解更多关于这个问题的细节。

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

1 回答 1

4

POSIX 规范列出了必须“与其他线程同步内存”的函数,其中包括 和 之类的pthread_mutex_lock()函数pthread_mutex_unlock()

附录 A.4.11中详细说明了“同步内存”的功能:

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

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

从来没有明确指定隐含什么样的内存同步指令 - 隐含的规范是,如果您使用一对“同步指令”来确保一个线程中的读取必须在另一个线程中的写入之后发生,那么您的程序将正确操作。这包括编译器和架构重新排序效果。

于 2012-06-12T14:00:30.653 回答