我是pthreads的新手,我需要安全地从所有线程共享的链表中删除节点。我不完全理解什么时候锁定和解锁一个节点。这是目前为止我移除头部节点的方法。我锁定头部之前,它被访问(它是在while条件访问),但我什么时候解锁它?
在删除节点时,您不能仅仅锁定节点本身:因为您将指针更改为存储在节点外部的节点,因此您需要保护该指针不受并发访问。
也就是说,不能用head->lock
来保护head
,因为lock
在节点内,而指针head
本身不是。例如,您可以在head
旁边声明一个名为head_lock
的锁。
这也影响你的代码如何添加和查找列表的工作-代码需要锁定head_lock
,而它访问head
指针。
您是否应该仅依赖单个head_lock
来保护整个列表,或者也具有单独的每个节点锁,这取决于您如何使用列表节点以及访问列表的争用量。