假设我有一个列表,并且我想使用test_and_set
操作,其中的参数是某个指针地址l->a.next->next
的计算。我认为,这不会是原子的,test_and_set
将是无用的。有没有办法以原子方式计算指针值,以便TAS能够以原子方式工作?列表上的原子操作
列表上的原子操作
回答
您可能的意思是CAS(更有用)。
一般:是的,它经常被用来实现事务或无等待数据结构,
BUF首先第一件事情:让我们分开的原子操作地址计算上的地址,你第一次得到具体地址在哪些东西应该交换,CAS不关心你如何到达那里。
具体而言,您应该先让每个线程浏览列表,直到他们找到他们想要替换下一个指针的地方,然后他们可以尝试使用CAS重复此操作。这取决于您的情况,线程是否必须重新列出重试列表。
的棘手的部分实际上是在代码中不同的地方:在这里你免费(或重新使用)列表节点。一般来说,您必须假设您不能重复使用或释放与您的列表有史以来断开连接的节点链。在实践中可以使用heursitics,但这取决于你的用例。
应该指出的是,虽然你展示的技术通常是如何创建锁定免费的数据结构。如上所述,它患有ABA问题。查看DCAS(http://en.wikipedia.org/wiki/Double_compare-and-swap)来处理这个问题。 – 2013-02-28 20:58:13
@EvanTeran dCAS不是真的可用。很好,还有其他方法可以解决这个问题。 – 2013-02-28 21:17:17
- 1. CUDA原子操作列表
- 2. 的Javascript原子一系列操作
- 3. 80x86上的原子位域操作?
- 4. 共享内存上的原子操作
- 5. 原子操作 - C
- 6. DerbyJS原子操作
- 7. File.Move原子操作
- 8. 原子操作和原子交易
- 9. ARM中的原子操作
- 10. Django中的原子操作?
- 11. CUDA中的原子操作
- 12. Sequelize中的原子操作
- 13. 什么操作都是原子操作
- 14. 列表上的操作ADT
- 15. 挥发和原子操作
- 16. 写一个原子操作
- 17. x86 128位原子操作
- 18. 让两个操作原子
- 19. Qt原子操作实现
- 20. 原子操作实现
- 21. 原子操作在C++
- 22. CUDA:还原还是原子操作?
- 23. Linq - 在列表上操作
- 24. 嵌套的原子操作保证是原子吗?
- 25. 无锁结构的C++原子操作
- 26. 挥发物的操作原子性
- 27. Cuda无符号短操作的原子操作
- 28. CUDA中的共享内存上的原子操作
- 29. linux上的Solaris studio中的原子操作
- 30. Intel XScale(ARM)处理器上的原子操作问题 - XScale-IXP42x系列 - C++
这里有很多不同之处,所以我不认为你想要的东西可以在没有锁或双重CAS用法的情况下完成。 – 2013-02-28 19:54:56