Del。和r / w链接带有RW锁的多线程中的列表节点 - >死锁?

时间:2017-03-15 13:19:27

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

我有一个问题,关于多线程中的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是否处于死锁状态,因为我使用free(b)删除了B中的Lock?
我是否必须销毁线程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;

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

亲切的问候

1 个答案:

答案 0 :(得分:0)

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

我还强烈推荐经典作品"多处理器编程的艺术"来自同一作者,如果您对多线程非常感兴趣,这是必读的书。