我正在使用Hazard指针,以便在C中实现无锁链接列表.
除了各种基本队列和堆栈之外,我找不到任何示例代码.
问题是我需要遍历列表,所以我的问题是我是否可以在分配后更改危险指针的值.
例如:
除了各种基本队列和堆栈之外,我找不到任何示例代码.
问题是我需要遍历列表,所以我的问题是我是否可以在分配后更改危险指针的值.
例如:
t←Top while(true) { if t=null then return null *hp←t if Top!=t then continue ... t←(t→next) //after this instruction pointer t will be still protected? }
解决方法
最后,我根据
the original paper结束了我自己版本的危险指针(HP).我的问题的答案是否定的,不再使用安全.原因是,HP工作的方式,* hp在您将其声明为危险指针时保护被t指向的节点,因此当t移动到下一个节点时,HP机制会继续保护前一个节点.在我可以安全使用之前,我必须将新值重新分配给* hp.
此外,在纸张的示例中,它并不明确,但是当您使用危险指针时,您必须释放它.这意味着,将* hp返回到其原始状态(NULL).这样,如果另一个线程想要删除(退出)该节点,它将不会被视为被使用.
在上面的例子中,我必须在离开方法之前释放* hp.在循环内部没有必要,因为我覆盖了相同的* hp位置(* hp←t),因此前一个节点不再受到保护.