首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现没有内存障碍的InterlockedIncrement

如何实现没有内存障碍的InterlockedIncrement
EN

Stack Overflow用户
提问于 2012-10-15 11:08:12
回答 2查看 817关注 0票数 2

我实现了一个引用计数模式,为此我需要互锁设施,但没有内存围栏(据我所知)。

不幸的是,只有Windows有一个固有的InterlockedDecrementNoFence编译器。我如何使用asm内联来做到这一点?我也需要这个给gcc/当。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-15 11:21:22

对于此操作的语义而言,缺少至少一个内部内存围栏操作(取决于平台)几乎是不可能的。为了使原子递增/递减起作用,另一个处理器在对变量执行自己的操作之前必须确保看到原子操作的值,并且对变量的操作的可见性必须具有某种保证的总顺序。内存障碍,甚至是像x86这样的强内存模型中的隐式障碍,其中标准内存操作具有获取/释放语义,对于原子增量/减量操作的正确性至关重要。

请记住,即使MSVC/gcc的文档指出存在内存屏障,由于平台的强内存模型,在x86上也不会应用实际的内存屏障(即MFENCE指令),而是在内存总线上应用锁以确保操作的原子性。另一方面,IA64将需要一个内存屏障,因为该平台的内存模型较弱。对于ARM也是如此。

票数 1
EN

Stack Overflow用户

发布于 2012-10-15 12:25:58

这不是一个直接的答案,而是一个替代方案。如果您可以使用C11 (或C++11),那么使用memory_order_relaxed进行原子操作如何?在弱内存模型平台上,您的编译器可能不会生成内存栅栏。(这取决于编译器供应商/版本)

代码语言:javascript
运行
复制
#include <stdatomic.h>

atomic_int var;
int oldval;

oldval = atomic_fetch_sub_explicit(&var, 1, memory_order_relaxed);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12888779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档