2017-07-27 59 views
-2

我試圖解鎖互斥鎖,如果它被鎖定。但是,所以我想我會用恢復方法產生一個運行時錯誤:從鎖定的同步恢復。互斥體

package main 

import "sync" 

func main() { 
    var l sync.Mutex 
    l.Lock() 
    l.Unlock() 

    defer func() { 
     if recover() != nil { 
      // the return result can be altered 
      // in a defer function call 

     } 
    }() 

    l.Unlock() 

} 

然而,即使恢復,我仍然得到:

fatal error: sync: unlock of unlocked mutex 
+1

不能解鎖已經被解鎖的互斥。與您無法鎖定已鎖定的互斥鎖相同。 – RayfenWindspear

+1

解鎖已解鎖的互斥鎖意味着您的程序不正確,並且無法恢復。 – JimB

+0

這是很不清楚你在問什麼... – RayfenWindspear

回答

-1

可以推遲解鎖互斥後立即鎖定它,因此您不必記住爲退出該函數的每個返回路徑解鎖它。下l.Lock

刪除l.Unlock()或改變它

defer l.Unlock() 

,並刪除第二l.Unlock

+0

@downvoters:這個答案有什麼問題?除非我錯過了一些東西,這是一個有效的解決方案Upvoted。 – thwd

+0

儘管這在技術上是正確的,但它卻忽略了從雙重解鎖恢復問題的重點。 OP知道第二個'解鎖'是問題,這只是爲了演示運行時錯誤。 – JimB