Go 學習筆記11 互斥鎖,讀寫鎖,狀態協程

2021-10-05 05:23:46 字數 2207 閱讀 7228

互斥所 它由標準庫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...