1

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

4

1 回答 1

1

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

需要内存屏障但不需要 CAS 或锁定的算法的最佳示例是 Dekker 协议。“基于位置的内存栅栏”的第 1 节很好地概述了该协议。

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

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

于 2013-10-17T14:45:39.817 回答