【问题标题】:Del. and r/w linked List Nodes in Multithreading with RW-locks -> deadlocks?Del. 和 r/w 在多线程中使用 RW 锁 -> 死锁链接列表节点?
【发布时间】:2026-01-21 11:45:01
【问题描述】:

我有一个问题,关于在多线程中使用单链表时 rw-locks 究竟是如何实现的。

首先是 Pitcure 中的场景:

    Head ==> A ==> B ==> C ==> Tail
                   ^    
                  | |
                  |  ----------> Thread 2:
            Thread 1:            - rw-access B    
            -deleting B

现在是文本;线程 1 正在删除节点 B,因此在锁定到 B 后锁定 A 并锁定 B,线程 2 正在尝试向/从 B 读取或/和写入信息,因此他试图锁定 B 并且讨厌等等,因为线程 1 已经锁定了 B。

现在我有点困惑
线程 1 删除 B 并解锁 B 后会发生什么?
线程 1 是否处于死锁状态,因为我删除了 Lock在 B 中使用 free(b) 吗?
我必须在线程 1 中销毁 B 的锁吗?
我是否必须在例行公事?比如:获得锁后检查 B 是否仍然是节点?
这里用另一张“图”来说明。

Thread 1                Thread 2
----------------------  ----------------------
Lock A                  
Lock B                         
A->next = C;            Lock B
Unlock A                waiting ...
free(B)                 waiting ...
Unlock B                waiting ...
                        Get Lock B
                        Try to read/write B  // what happens now?

我的列表元素如下所示

typedef struct Node
{
    char Name[21];          // Information Dummy
    pthread_rwlock_t aLock; // rw lock
    Node *next;             // pointer to the next node
}Node;

我希望我能够说明我的问题;)

亲切的问候

【问题讨论】:

    标签: c multithreading linked-list thread-safety pthreads


    【解决方案1】:

    如果你想插入/删除列表节点,那么在不锁定整个列表的情况下进行细粒度同步有点棘手。最好的开始方法是浏览 Maurice Herlihy 和 Nir ​​Shavit 的幻灯片:“Linked Lists: Locking, Lock-Free, and Beyond ...”。

    我也强烈推荐同一作者的经典著作《多处理器编程的艺术》,如果你对多线程非常感兴趣,这是一本必读的书。

    【讨论】:

    • 首先感谢您的评论和书籍提示,我对您推荐的文献做了一些研究,几乎没有一个问题得到解答,但我学到了一些我喜欢的新东西要知道;)