列表上的原子操作

时间:2013-02-28 19:53:35

标签: c concurrency atomic test-and-set

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

1 个答案:

答案 0 :(得分:2)

您可能意味着 CAS (更有用)。

一般来说:是的,它通常用于实现事务性或无等待的数据结构,

首先解决问题:让我们将地址计算与地址上的原子操作分开,首先得到应该交换某些内容的具体地址,CAS不关心你是如何到达那里的。

具体来说,您应首先让每个线程导航列表,直到找到他们想要替换下一个指针的位置,然后他们可以尝试使用CAS重复此操作。取决于您的场景,线程是否必须重新遍历列表以进行重试。

棘手的部分实际上位于代码中的不同位置:您免费(或重新使用)列表节点。通常,您必须假设您无法重复使用或释放​​与列表永远断开连接的节点链。在实践中,你可以使用heursitics,但这取决于你的用例。