2013-02-28 63 views
3

假设我有一个列表,并且我想使用test_and_set操作,其中的参数是某个指针地址l->a.next->next的计算。我认为,这不会是原子的,test_and_set将是无用的。有没有办法以原子方式计算指针值,以便TAS能够以原子方式工作?列表上的原子操作

+0

这里有很多不同之处,所以我不认为你想要的东西可以在没有锁或双重CAS用法的情况下完成。 – 2013-02-28 19:54:56

回答

2

您可能的意思是CAS(更有用)。

一般:是的,它经常被用来实现事务或无等待数据结构,

BUF首先第一件事情:让我们分开的原子操作地址计算上的地址,你第一次得到具体地址在哪些东西应该交换,CAS不关心你如何到达那里。

具体而言,您应该先让每个线程浏览列表,直到他们找到他们想要替换下一个指针的地方,然后他们可以尝试使用CAS重复此操作。这取决于您的情况,线程是否必须重新列出重试列表。

棘手的部分实际上是在代码中不同的地方:在这里你免费(或重新使用)列表节点。一般来说,您必须假设您不能重复使用或释放​​与您的列表有史以来断开连接的节点链。在实践中可以使用heursitics,但这取决于你的用例。

+0

应该指出的是,虽然你展示的技术通常是如何创建锁定免费的数据结构。如上所述,它患有ABA问题。查看DCAS(http://en.wikipedia.org/wiki/Double_compare-and-swap)来处理这个问题。 – 2013-02-28 20:58:13

+0

@EvanTeran dCAS不是真的可用。很好,还有其他方法可以解决这个问题。 – 2013-02-28 21:17:17