【问题标题】:Memory barriers through programming编程造成的记忆障碍
【发布时间】:2013-10-24 02:07:13
【问题描述】:

是否可以通过代码实现内存屏障(不使用 CAS 或其他锁定原语,如 volatile、原子类等)?
我相信破坏者能够实现它,而无需实际对任何锁定原语进行排序。
任何有助于理解这一点的指针或参考资料都会有所帮助。
对其他编程模式(最好在 java 中)的建议也值得赞赏。

【问题讨论】:

    标签: memory-management memory-barriers


    【解决方案1】:

    内存屏障的概念与 CAS 和其他锁定原语正交。例如,如果使用 memory_order_relaxed 指定,C++11 允许 CAS 操作根本没有任何内存屏障。某些硬件,尤其是 x68,总是将内存屏障与原子读取-修改-写入操作相关联。

    需要内存屏障但不需要 CAS 或锁定的算法的最佳示例是 Dekker 协议。 “Location-Based Memory Fences”的第 1 节很好地概述了该协议。

    请参阅我的博客 Volatile: Almost Useless for Multi-Threaded Programming,了解为什么 volatile 无法用作内存屏障。

    C++ 特定信息:在 C++11 中,使用 std::atomic_thread_fence。前面的链接有一个很好的例子,可以在没有锁定的情况下使用它。如果处理较旧的 C++ 编译器,您将需要求助于特定于供应商的例程。一种方法是使用英特尔线程构建模块的 tbb::atomic_fence()。它是我们能找到的任何特定平台围栏的包装器。

    【讨论】:

      猜你喜欢
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多