1. 程式人生 > >golang 中 鎖的錯誤的用法會導致死鎖。

golang 中 鎖的錯誤的用法會導致死鎖。

package main

import (
	"sync"
	"time"

	. "github.com/soekchl/myUtils"
)

var mux sync.RWMutex

func tt() {
	Notice()
	mux.Lock() // 3
	Notice()
	defer mux.Unlock()
	time.Sleep(time.Second * 5)

}

func main() {
	go tt()

	Notice()
	mux.RLock() // 1
	Notice()
	defer mux.RUnlock()
	time.Sleep(1 * time.Second)

	Notice()
	mux.RLock() // 2
	Notice()
	defer mux.RUnlock()
	time.Sleep(5 * time.Second)
}

這塊按照正常理論 沒有問題,程式 有時執行也沒有錯誤!  但是這樣寫不對的

如果  鎖3 先執行 這問題就沒有事兒

但是如果鎖 1 先執行    然後 鎖3   ,然後 鎖2的話 就死鎖了

鎖1 執行的時候  申請所 成功

然後 鎖3 排隊申請鎖

然後是 鎖2 

因為鎖2 排在 鎖3 後面  所以   鎖1的  defer 鎖還沒能執行    鎖3 一直申請不下來,鎖2也 一直排隊下去  然後就死鎖了!

大家在用鎖的時候 特別要小心,特別是跟 defer 一起用的時候  

我的建議是吧        帶鎖的操作 放進 一個 小函式裡 解決,不要再大一點的函式裡 寫 大量的  鎖和defer 解鎖。

相關推薦

golang 錯誤法會致死

package main import ( "sync" "time" . "github.com/soekchl/myUtils" ) var mux sync.RWMutex func tt() { Notice() mux.Lock() // 3

[譯]async/await使用阻塞式程式碼致死

    這篇博文主要是講解在async/await中使用阻塞式程式碼導致死鎖的問題,以及如何避免出現這種死鎖。內容主要是從作者Stephen Cleary的兩篇博文中翻譯過來. 原文1:Don'tBlock on Async Code 原文2:why the AspNet

訊號處理函式陷阱:呼叫malloc致死

    關於訊號處理signal()、sigaction()等的使用,相信很多人都已熟悉。 這裡主要想講一下訊號處理函式使用上的一個常見陷阱:訊號處理函式必須是可重入函式。如果訊號處理函式不可重入,那麼可能導致很多詭異問題。         《UNIX環境高階程式設計》

mysql先刪除後插入致死

cti 插入語 adl err values 並不是 trying error 問題 所報的錯誤為:pymysql.err.OperationalError: (1213, ‘Deadlock found when trying to get lock; try resta

【MySQL】Merge Index致死

水稻:最近有個朋友生產環境出現MySQL死鎖問題,一聽是死鎖,那必須去看看啊,於是饒(si)有(qu)興(huo)致(lai)的研究了好幾天 菜瓜:MySQL死鎖,趕緊分享一下 水稻:能否先讓我裝完X,我從朋友那裡拿到資料結構,復現,分析,查資料,總。。。 菜瓜:今天的菜真香 水稻:。。。好吧,進入正題(資料

C#調excel出數據時提示000208D5-0000-0000-C000-000000000046錯誤的解決辦法

logs error: 版本 .com cas ima microsoft rop primary 錯誤信息:000208D5-0000-0000-C000-000000000046 Unable to cast COM object of type ‘System.__C

在oracle11g刪除sde戶報ora - 21700錯誤的解決方法

11.2.0.1 pos all with username user 刪除 sel cat PS C:\Users\Administrator> sqlplus sys/xxxx@orcl as sysdba;SQL*Plus: Release 11.2.0.1.0

Python出現request模塊錯誤

detail tail ofo lib install 2.x req log python 2 python項目中 from urllib.request import urlopen ,導入request出問題,而進行完 pip install request 安裝後,

golangmutex的實現

golang中的鎖是通過CAS原子操作實現的,Mutex結構如下: type Mutex struct {     state int32             

Xdebug 修正 PHP 應用程式錯誤

雖然您可以使用 PHP 為系統管理和傳統資料處理之類的任務建立命令列指令碼,但是程式語言對 Web 應用程式的效能有主要影響。在使用過程中,每個 PHP 應用程式都駐留在伺服器上,並且將通過代理(例如 Apache)呼叫 PHP 應用程式處理到來的請求。對於每個請求,典

26.結構體替代類-golang的面向物件

歡迎訪問Golang 系列教程中的第26章。 是否面向物件? go不是一個純面向物件的程式語言。從 “Go’s FAQs” (go 常見問題解答)中取出的摘錄回答了go 是否為面向物件的問題。 Yes and no. Although Go has

元數據管理器存在錯誤 實例化來自文件“\?C:Program FilesMicrosoft SQL ServerMSAS11.MSSQLSERVEROLAPDataTfs_Analysis.0.dbvDimTestCaseOverlay.874.dim.xml”的元數據對象時出錯

參數配置 錯誤 manage 但是 加密 olap 右上角 alt 剛才 一、發現問題 啟動SQLSERVER的數據分析服務失敗 查看系統日誌錯誤如下: 雙擊錯誤後顯示詳細錯誤: 元數據管理器中存在錯誤。 實例化來自文件“\\?\C:\Pro

Go_16:GoLangflag標簽使用

span clas 格式化 print mes 初始 div fun sta   直接上代碼,在代碼中會做詳細的解釋,當前運行環境為:Go-1.8.1 package main import ( "flag" "log" "os" ) func

GO_05_2:Golang panic、recover、defer 的用法

log logs lan finall 可能 錯誤處理 錯誤 異常處理 auto 函數 defer   1. 它的執行方式類似其他語言中的折構函數,在函數體執行結束後按照調用順序的 相反順序 逐個執行   2. 即使函數發生 嚴重錯誤 也會被執行,類似於 java 中 t

Java、JavaWeb單元測試到的測試方法

enc nbsp 方法 hat 思維 .com java assert 可能 寫出的代碼做單元測試時,一定要記住從三個方面出發:1、成功 2、異常 3 邏輯錯誤(即沒有異常也可能程序運行出最後結果,可是呢?呵呵)。這就是在做測試時我要牢記的三個方面,同時思維要嚴謹也即做

作業一:登錄界面(優化,能讀取鎖定文件的任意戶名,一旦發現所輸入的戶名是鎖定文件的,立即告知並跳出循環)

col cnblogs 循環 lin auth pen str flag div 1 #Author:AXIN 2 #功能:登錄窗口 3 # 1.輸入用戶名,密碼 4 # 2.認證成功後輸出提示信息,表示歡迎 5 # 3.輸錯

PHP錯誤處理

日誌記錄 bre 級別 windows日誌 cati 地址 當前 錯誤類型 計算 一、PHP中調整錯誤報告級別的方式 1修改php.ini文件的配置項  註意:會導致在當前服務器環境下的所有PHP文件都受影響,實際開發過程中,不推薦此方式(如果代碼更換服務器會導致配置文件全

Java 從數據庫查找信息入Excel表格

多結果 tput session false 狀態 結果 mmu call excel表格 前端js function Excel (){ //ajax請求 $.ajax({ url : "outPutAboutShopInf

linux生成考核的GPT分區表結構修復案例

linux 數據恢復 gpt 分區損壞 目的:用於生成大量模擬破壞GPT分區結構案例,並生成唯一方式修復後的評判方法。故障:在一個完整的GPT分區磁盤上,丟失了GPT主分區表,或備份分區表。要求: 1、利用WINHEX手工方式,修復給定鏡像文件的分區結構。 2、不得對現存主分區表或

Makefile怎樣調python和perl文件為自己提供須要的數據

print erl col shel ria 實例代碼 space shell eight Makefile中怎樣調用python和perl文件為自己提供須要的數據,利用print函數對外輸出數據 實例代碼例如以下 perl.pl #!/usr/bin/per