我有一个问题,关于多线程中的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;
我希望我能够说明我的问题;)
亲切的问候
答案 0 :(得分:0)
如果要插入/删除列表节点,那么在不锁定整个列表的情况下进行细粒度同步有点棘手。最好的方法是浏览Maurice Herlihy& Nir Shavit:" Linked Lists: Locking, Lock-Free, and Beyond ..."。
我还强烈推荐经典作品"多处理器编程的艺术"来自同一作者,如果您对多线程非常感兴趣,这是必读的书。