我实现了一个引用计数模式,为此我需要互锁设施,但没有内存围栏(据我所知)。
不幸的是,只有Windows有一个固有的InterlockedDecrementNoFence编译器。我如何使用asm内联来做到这一点?我也需要这个给gcc/当。
发布于 2012-10-15 11:21:22
对于此操作的语义而言,缺少至少一个内部内存围栏操作(取决于平台)几乎是不可能的。为了使原子递增/递减起作用,另一个处理器在对变量执行自己的操作之前必须确保看到原子操作的值,并且对变量的操作的可见性必须具有某种保证的总顺序。内存障碍,甚至是像x86这样的强内存模型中的隐式障碍,其中标准内存操作具有获取/释放语义,对于原子增量/减量操作的正确性至关重要。
请记住,即使MSVC/gcc的文档指出存在内存屏障,由于平台的强内存模型,在x86上也不会应用实际的内存屏障(即MFENCE指令),而是在内存总线上应用锁以确保操作的原子性。另一方面,IA64将需要一个内存屏障,因为该平台的内存模型较弱。对于ARM也是如此。
发布于 2012-10-15 12:25:58
这不是一个直接的答案,而是一个替代方案。如果您可以使用C11 (或C++11),那么使用memory_order_relaxed进行原子操作如何?在弱内存模型平台上,您的编译器可能不会生成内存栅栏。(这取决于编译器供应商/版本)
#include <stdatomic.h>
atomic_int var;
int oldval;
oldval = atomic_fetch_sub_explicit(&var, 1, memory_order_relaxed);https://stackoverflow.com/questions/12888779
复制相似问题