首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用加载链接/存储条件的无锁C++11示例来防止阿坝?

使用加载链接/存储条件的无锁C++11示例来防止阿坝?
EN

Stack Overflow用户
提问于 2014-05-30 13:08:32
回答 1查看 1.5K关注 0票数 3

当使用比较和交换(CAS)技术编写无锁代码时,有一个称为ABA问题的问题:

problem

因此,仅仅在"A“值上进行比较是有问题的,因为在这两个观察结果之间仍然可能发生写。我阅读并找到了这样的解决方案:

http://en.wikipedia.org/wiki/LL/SC

在计算机科学中,负载链路和存储条件(LL/SC)是多线程实现同步的一对指令。link返回内存位置的当前值,而对同一内存位置的后续存储条件只有在自加载链接后该位置没有发生任何更新时才会存储一个新值。这一起实现了一个无锁的原子读-修改-写操作.

如何修改典型的C++无锁CAS技术以使用上述解决方案?有人能举个小例子吗?

我不介意它的C++11/x86,x86-64-linux(最好没有Win32答案)。

EN

回答 1

Stack Overflow用户

发布于 2014-05-30 13:28:03

LL/SC是由一些体系结构(如SPARC)实现的指令,它们构成了高层原子操作的基础。在x86中,您可以使用LOCK前缀来实现类似的目标。

为了避免美国律师协会的问题在x86与LOCK,你必须提供自己的保护,以防止干预商店。这样做的一种方法是存储与内存相邻的生成号(只是一个不断增加的整数)。每个更新程序都会进行原子比较/交换,以包括数据和序列号。只有在找到正确的数据和正确的编号时,更新才会成功。同时,它更新数字,以便其他线程看到更改。

你会注意到x86总是(?)提供了一个比机器字宽两倍的CMPXCHG指令(参见CMPXCHG8B和后来的CMPXCGH16B),可用于此目的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23955406

复制
相关文章

相似问题

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