Golang 之sync包應用

2022-06-10 22:03:10 字數 1557 閱讀 5476

保證共享資源的互斥訪問

mutex := &sync.mutex{}

mutex.lock()

//update共享變數 (比如切片,結構體指標等)

mutex.unlock()

讀寫互斥鎖,可以對讀加鎖

mutex := &sync.rwmutex{}

mutex.lock()

//update 共享變數

mutex.unlock()

mutex.rlock()

//read 共享變數

mutex.runlock()

使用add()新增計數,done()減掉乙個計數,計數不為0, 阻塞wait()的執行

將陣列每個值取平方,最後求所有的值的和,可以開陣列大小的協程,用sync控制所有的協程都計算完成

package main

import (

"fmt""

sync")

func opera(a

int, taskres chan int, wg *sync.waitgroup)

func main()

taskres := make(chan int

, len(a))

varwg sync.waitgroup

for _, v :=range a

wg.wait()

close(taskres)

var result int = 0

//range只能for關閉了的channel

for i :=range taskres

fmt.println(result)

}

保證乙個函式僅被執行一次

once := &sync.once{}

for i := 0; i < 4; i++)

}()}

用於goroutine之間的協作,用於協程的掛起和喚醒。

避免輪訓空等,待著就好,wait別人signal你

func main() 

condition--fmt.printf(

"consumer: %d\n

", condition)

cond.signal()

cond.l.unlock()

}}()

//producer

for condition++fmt.printf(

"producer: %d\n

", condition)

cond.signal()

cond.l.unlock()

}}輸出:

producer: 1

consumer: 0

producer: 1

consumer: 0

producer: 1

consumer: 0

producer: 1

consumer: 0

producer: 1

consumer: 0

學習golang之同步原語sync包

資源競爭 以上被加鎖保護的 sum i 片段又稱為臨界區。這個示例開啟了 10 個協程,它們同時讀取 sum 的值。因為 readsum 函式並沒有任何加鎖控制,所以它不是併發安全的,即乙個 goroutine 正在執行 sum i 操作的時候,另乙個 goroutine 可能正在執行 b sum ...

golang 之sync 併發安全鎖

讓乙個程式併發安全並不需要其中的每乙個具體型別都是併發安全的。實際上併發安全的型別其實是特例而不是普遍存在的,所以僅在文件指出型別是安全的情況下,才可以併發的訪問乙個變數。與之對應的是,匯出的包級別函式通常可以認為是併發安全的。因為包級別的變數無法限制在乙個goroutine內。所以那些修改這些變數...

golang中併發sync和channel

golang中實現併發非常簡單,只需在需要併發的函式前面新增關鍵字 go 但是如何處理go併發機制中不同goroutine之間的同步與通訊,golang 中提供了sync包和channel機制來解決這一問題 sync 包提供了互斥鎖這類的基本的同步原語.除 once 和 waitgroup 之外的型...