unix环境高级编程的多线程死锁例子没看懂,求解释??
unix环境高级编程第三版323面<爱尬聊_创建词条>到325面那个多线程操作哈希表的例子。
我不懂的是为什么最后释放节点的时候,作者先对节点加锁获取其引用次数,次数为1需要删除节点。然后作者后面解释到,需要释放这个锁才能对哈希表加锁,才能删除节点。请问这是为什么?在这种情况下不就是先获得哈希表锁再获得节点锁,和前面的添加节点加锁顺序相反,还有可能造成死锁啊。
有你真好啊 22小时前
因为你需要摘除节点,就必须对哈希表进行加锁,如果没有加锁,则可以有一个线程调用了foo_find
拿到了这个节点。又因为释放节点必须先对其解锁,那么就有可能你这里刚解锁,另一个线程通过foo_hold
对其进行使用了。然后节点被销毁,可是还有一个线程正在引用它。
meizhouliyu 22小时前
几个函数大致就是这样的结构,前面的就不画图了,最后foo_rele
画一个图详细的说一下。如果在第一次判断引用计数为1的时候,不对节点进行解锁,直接从哈希表中摘除并进行释放,这里会出问题。
360U644496881 22小时前
淡淡的愉悦玄霄一生寂寥冷默言语 22小时前
添加节点的时候,节点都是新申请的,不存在被其他线程使用的情况,所以不会造成死锁。
廖云建 22小时前
这里是有原因的,先来看看大致的流程结构