unix環境高級編程的多線程死鎖例子沒看懂,求解釋??
unix環境高級編程第三版323面<愛尬聊_創建詞條>到325面那個多線程操作哈希表的例子。
我不懂的是為什么最后釋放節點的時候,作者先對節點加鎖獲取其引用次數,次數為1需要刪除節點。然后作者后面解釋到,需要釋放這個鎖才能對哈希表加鎖,才能刪除節點。請問這是為什么?在這種情況下不就是先獲得哈希表鎖再獲得節點鎖,和前面的添加節點加鎖順序相反,還有可能造成死鎖啊。
有你真好啊 22小時前
因為你需要摘除節點,就必須對哈希表進行加鎖,如果沒有加鎖,則可以有一個線程調用了foo_find拿到了這個節點。又因為釋放節點必須先對其解鎖,那么就有可能你這里剛解鎖,另一個線程通過foo_hold對其進行使用了。然后節點被銷毀,可是還有一個線程正在引用它。
meizhouliyu 22小時前
幾個函數大致就是這樣的結構,前面的就不畫圖了,最后foo_rele畫一個圖詳細的說一下。如果在第一次判斷引用計數為1的時候,不對節點進行解鎖,直接從哈希表中摘除并進行釋放,這里會出問題。
360U644496881 22小時前
淡淡的愉悅玄霄一生寂寥冷默言語 22小時前
添加節點的時候,節點都是新申請的,不存在被其他線程使用的情況,所以不會造成死鎖。
廖云建 22小時前
這里是有原因的,先來看看大致的流程結構
