互斥所 它由標準庫sync.mutex來表示 方法有 lock和unlock
package main
import
("fmt"
"time"
)func
printer
(str string
) fmt.
println()
}func
print1()
func
print2()
func
main()
輸出結果為
hwoelrllo
d我們希望是
hello
world
這時候可以使用互斥鎖了
package main
import
("fmt"
"time"
"sync"
)// 建立互斥鎖物件
var mutex sync.mutex
func
printer
(str string
) fmt.
println()
mutex.
unlock()
// 解鎖
}func
print1()
func
print2()
func
main()
上面的互斥所,資源同時只能有乙個協程訪問但是,當我們取讀資料的時候,資料是不會變得,可以隨意的訪問
只有修改,寫操作的時候,才會出現問題,這樣讀寫鎖就出現了
var mutex sync.rwmutex
package main
import
("sync"
"math/rand"
"time"
"fmt"
)var count int
var mutex sync.rwmutex
func
write
(n int
)func
read
(n int
)func
main()
// 10個協程寫
for i :=
0; i <
10; i++
time.
sleep
(time.second*5)
}
package main
import
("fmt"
"math/rand"
"sync/atomic"
"time"
)// 建立 讀 寫 結構體
type readop struct
type writeop struct
func
main()
}}()
// 讀,100個協程
for r :=
0; r <
100; r++
//請求讀操作
reads <- read
// 等待返回
<-read.resp
// 累加1
atomic.
addint64
(&ops,1)
}}()
}// 寫 10個協程
for w :=
0; w <
10; w++
// 請求寫操作
writes <- write
// 等待返回
<-write.resp
// 累加1
atomic.
addint64
(&ops,1)
}}()
}// 讓 go 協程們跑 1s。
time.
sleep
(time.second)
// 最後,獲取並報告 `ops` 值。
opsfinal := atomic.
loadint64
(&ops)
fmt.
println
("ops:"
, opsfinal)
}
Go 互斥鎖和讀寫互斥鎖的實現
目錄 先來看這樣一段 所存在的問題 var wg sync.waitgroup var x int64 func main func f wg.done 這裡為什麼輸出是 12135 不同的機器結果不一樣 而不是20000。因為 x 的賦值,總共分為三個步驟 取出x的值 計算x的結果 給x賦值。那麼...
28 學習 Go 協程 互斥鎖和讀寫鎖
在 19.學習 go 協程 詳解通道 通道 這一節裡我詳細地介紹信道的一些用法,要知道的是在 go 語言中,通道的地位非常高,它是 first class 級別的,面對併發問題,我們始終應該優先考慮使用通道,如果通過通道解決不了的,不得不使用共享記憶體來實現併發程式設計的,那 golang 中的鎖機...
互斥鎖和讀寫鎖
互斥鎖的型別 對資源的訪問是互斥的,即執行緒a對資源加鎖後,在a解鎖前,其他執行緒不能訪問這個加鎖的資源。互斥鎖的特點 多個執行緒訪問資源的時候是序列的 互斥鎖的使用步驟 建立乙個互斥鎖 pthread mutex t mutex 初始化這把鎖 pthread mutex init mutex,nu...