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:应该使用类的实例来保存锁以保证解锁.我把它留下来简化示例.
它不可能知道我将如何在其他编译单元中实现这些功能。
这是关键 - 由于编译器(通常)无法了解函数调用的实现,因此它无法将存储移动到_field这些函数调用之外。
一般来说,由于_field可以在外部访问SomeClass::store()(不是本地),编译器无法知道它是否被外部函数修改,因此它必须在_field函数调用序列点之间执行存储。
底层硬件平台可能需要以内存屏障或缓存刷新的形式进行一些关注,以处理硬件中发生的缓存或无序操作。如有必要,平台的互斥 API 实现将处理这些问题。
| 归档时间: |
|
| 查看次数: |
1533 次 |
| 最近记录: |