c - 使用危险指针遍历列表

标签 c linked-list thread-safety

我正在使用 Hazard pointer 来实现 C 中的无锁链表。 除了 vary basics queues 和 stacks 之外,我找不到任何示例代码。 问题是我需要遍历列表,所以我的问题是我是否可以在分配后更改风险指针的值。 例如:

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) 的实现.我的问题的答案是否定的,t 不再可以安全使用。原因是,根据 HP 的工作方式,*hp 正在保护 t 指向的节点,当您将它声明为危险指针时,所以当 t 移动到下一个节点,HP机制一直保护前一个节点。在我可以安全地使用它之前,我必须将新值重新分配给 *hp

另外,在论文的例子中,它不是显式的,但是当你用完一个危险指针时,你必须释放它。这意味着,将 *hp 返回到其原始状态 (NULL)。这样,如果另一个线程想要删除(退出)这个节点,它就不会被视为正在使用。

在我上面的示例中,我必须在离开方法之前释放 *hp。在循环中没有必要,因为我正在覆盖相同的 *hp 位置 (*hp ← t),因此前一个节点不再受到保护。

关于c - 使用危险指针遍历列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20362335/

相关文章:

c# - 尝试从 C Dll 调用 C# 函数

java - 通过静态工厂确保 java 中的安全发布和线程安全

algorithm - 返回单向链表尾部(或末尾)的第 k 个元素

c - 递归反向链表

c - Free() 指向 Struct 的指针,位于 Struct 内部

java - max 的线程安全实现

java - 使用 ThreadLocal 与以 Thread 作为键的 HashMap

c - 为什么这个计算字符串长度的 C 程序会给出错误的输出?

c - 与 MPI 相关的 'cluster' 软件的作用是什么?

计算数组中字母出现的次数