【发布时间】:2010-04-22 22:38:45
【问题描述】:
假设我有自己的非内联函数 LockMutex 和 UnlockMutex,它们在内部使用了一些适当的互斥锁 - 例如 boost。编译器如何知道不对 LockMutex 和 UnlockMutex 调用的其他操作重新排序?它不可能知道我将如何在其他编译单元中实现这些功能。
void SomeClass::store(int i)
{
LockMutex(_m);
_field = i; // could the compiler move this around?
UnlockMutex(_m);
}
ps:应该使用类的实例来持有锁以保证解锁。为了简化示例,我省略了这一点。
【问题讨论】:
-
我想指出,尽管编译器重新排序处理器也可以重新排序指令(请参阅缓存一致性)。 Mutex 实现也插入了内存屏障,因此它绝对是运行时安全的。
标签: c++ compiler-optimization memory-barriers