假设我有自己的非内联函数 LockMutex 和 UnlockMutex,它们在内部使用了一些适当的互斥锁 - 例如 boost。编译器如何知道不对调用 LockMutex 和 UnlockMutex 的其他操作重新排序?它不可能知道我将如何在其他编译单元中实现这些功能。
void SomeClass::store(int i)
{
LockMutex(_m);
_field = i; // could the compiler move this around?
UnlockMutex(_m);
}
ps:应该使用类的实例来持有锁以保证解锁。为了简化示例,我将其省略。
最佳答案
It can not possibly know how will I implement these functions in some other compilation unit.
这是关键 - 因为编译器无法(通常)知道函数调用的实现,所以它无法将存储移动到那些函数调用之外的 _field
。
通常,由于 _field
可以在 SomeClass::store()
之外访问(它不是本地的),编译器无法知道它是否被修改外部函数,因此它必须执行存储到函数调用序列点之间的 _field
。
底层硬件平台可能需要以内存屏障或缓存刷新的形式引起注意,以处理硬件中发生的缓存或乱序操作。该平台的互斥 API 实现将在必要时处理这些问题。
关于c++ - 编译器围绕互斥锁边界重新排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2695012/