c - Del. and r/w linked List Nodes in Multithreading with RW-locks -> 死锁?

标签 c multithreading linked-list thread-safety pthreads

我有一个问题,关于多线程中的读写锁究竟如何与单链表一起工作。

首先是 Picure 中的场景:

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

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

现在我有点迷茫
线程 1 删除 B 并解锁 B 后会发生什么?
线程 1 是否处于死锁状态,因为我使用 free(b) 删除了 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;

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

亲切的问候

最佳答案

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

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

关于c - Del. and r/w linked List Nodes in Multithreading with RW-locks -> 死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42810997/

相关文章:

c - 在 C 中使用 scanf 在 EOF 处退出 while 循环

java - 如何制作 block 感知执行上下文?

java - 无法启动线程(实现Runnable)

java - 我正在尝试创建一个循环链接列表请告诉我这是否是正确的方法

c - 错误 : request for member ‘****’ in something not a structure or union

c - 从目录中获取所有文件名

C - 在非结构或 union 中请求成员 ‘x’

c - 如何将#define 常量从.h 文件导入Ada?

c - C语言中输入数值时如何将光标移动到鼠标位置?

c - 链表中的字符串相互重叠 C