c++ - 编译器围绕互斥锁边界重新排序?

标签 c++ compiler-optimization memory-barriers

假设我有自己的非内联函数 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/

相关文章:

c++ - Direct3D 11 缺少 GetRasterStatus,如何检测垂直空白期?

c++ - 错误 : name followed by '::' must be a class or namespace name

c++ - 管道使用 WriteConsole 的程序

c++ - 等同于 PEXT Haswell 指令的标准 C++11 代码(并且可能会被编译器优化)

c++ - 非 const 左值传递时 memory_order 更改为默认值

c++ - std::shared_ptr 的 use_count() 周围的完整内存屏障是否会使它成为可靠的计数器?

c++ - 让线程池的所有线程执行给定的函数

c++ - 如何通过编译器设置(不是编译指示)告诉 GCC 将结构大小边界设置为 4 个字节?

c - 哪些特定的优化标志负责优化变量

c++ - 条件变量的 "wait"函数在提供谓词时导致意外行为