编译器绕互斥边界重新排序?

sho*_*tsy 7 c++ compiler-optimization memory-barriers

假设我有自己的非内联函数LockMutex和UnlockMutex,它们正在使用一些适当的互斥体 - 例如boost - inside.对于LockMutex和UnlockMutex的调用,编译器如何知道不重新排序其他操作?它不可能知道如何在其他编译单元中实现这些功能.

void SomeClass::store(int i)
{
  LockMutex(_m);
  _field = i;  // could the compiler move this around?
  UnlockMutex(_m);
}
Run Code Online (Sandbox Code Playgroud)

ps:应该使用类的实例来保存锁以保证解锁.我把它留下来简化示例.

Mic*_*urr 3

它不可能知道我将如何在其他编译单元中实现这些功能。

这是关键 - 由于编译器(通常)无法了解函数调用的实现,因此它无法将存储移动到_field这些函数调用之外。

一般来说,由于_field可以在外部访问SomeClass::store()(不是本地),编译器无法知道它是否被外部函数修改,因此它必须在_field函数调用序列点之间执行存储。

底层硬件平台可能需要以内存屏障或缓存刷新的形式进行一些关注,以处理硬件中发生的缓存或无序操作。如有必要,平台的互斥 API 实现将处理这些问题。