2023-06-26 17:14:32來源:今日頭條
(資料圖片)
sync.Cond是Golang標(biāo)準(zhǔn)庫提供的一個(gè)基于互斥鎖/讀寫鎖實(shí)現(xiàn)的條件變量類型,用于協(xié)調(diào)訪問共享資源的多個(gè)goroutine。當(dāng)共享資源狀態(tài)發(fā)生變化時(shí),可以通知等待條件變化而阻塞的goroutine。sync.Cond提供了一個(gè)創(chuàng)建方法和三個(gè)成員方法,如下:
NewCond(l Locker) ,創(chuàng)建Cond對象,需要傳入一個(gè)鎖對象,互斥鎖或讀寫鎖;Wait(),阻塞當(dāng)前goroutine,等待通知信號(hào);Signal(),發(fā)送信號(hào)通知,喚醒一個(gè)等待的goroutine;Broadcast(),發(fā)送信號(hào)通知,喚醒多個(gè)等待的goroutine。sync.Cond需要與一個(gè)互斥鎖或讀寫鎖一起使用,以確保不會(huì)同時(shí)操作共享資源。當(dāng)處于鎖定狀態(tài)時(shí),goroutine將阻塞在Wait()方法中,直到另一個(gè)goroutine通過Broadcast()、Signal()方法發(fā)出通知信號(hào)。
使用方法和示例具體使用方法如下:
創(chuàng)建一個(gè)Mutex對象var mutex = sync.Mutex{}
創(chuàng)建Cond對象,傳入Mutexcond := sync.NewCond(&mutex)
等待通知信號(hào),阻塞當(dāng)前goroutinecond.Wait()
發(fā)送通知信號(hào),喚醒一個(gè)或多個(gè)等待的goroutinecond.Signal() // 喚醒一個(gè)goroutine// 或者 cond.Broadcast() 喚醒多個(gè)goroutine
看一個(gè)示例:
package mainimport ("log""sync""time")func read(index int, c *sync.Cond) {c.L.Lock()c.Wait()log.Println(index, "開始讀")c.L.Unlock()}func write(c *sync.Cond) {log.Println("開始寫")time.Sleep(time.Second)log.Println("喚醒其中一個(gè)goroutine")c.Signal()}func main() {cond := sync.NewCond(&sync.Mutex{})for i := 1; i <= 5; i++ {go func(index int) {read(index, cond)}(i)}write(cond)time.Sleep(time.Second * 3)}
輸出內(nèi)容如下:
2023/05/19 22:01:34 開始寫2023/05/19 22:01:35 喚醒其中一個(gè)goroutine2023/05/19 22:01:35 2 開始讀
可以看出,Signal()方法只喚醒了一個(gè)goroutine,可以把第二十行更改為c.Broadcast(),運(yùn)行看下效果,會(huì)發(fā)現(xiàn)所有g(shù)oroutine都被喚醒了。
小結(jié)sync.Cond通過基于底層機(jī)制制定通知等待列表,在goroutine等待通知時(shí)將它添加到等待通知的列表中,然后通過Signal()或Broadcast()方法發(fā)出通知信號(hào)來喚醒等待的goroutine,實(shí)現(xiàn)條件變量和goroutine的通信和同步。
使用sync.Cond可以使并發(fā)編程更加高效和靈活,避免了使用time.Sleep()或者空for循環(huán)的一些缺點(diǎn)。但是,使用條件變量也需要小心使用,必須避免死鎖和競態(tài)條件等問題。
關(guān)鍵詞:
sync Condsync Cond是Golang標(biāo)準(zhǔn)庫提供的一個(gè)基于互斥鎖 讀寫鎖實(shí)現(xiàn)的
哈嘍,大家好,我是了不起。首先,Swagger這個(gè)工具能夠自動(dòng)生成API接口
杭州亞運(yùn)會(huì)已進(jìn)入100天倒計(jì)時(shí),代表中國參加亞運(yùn)的“電競國家隊(duì)”終于
一場時(shí)隔26年的“世紀(jì)大和解”將長安馬自達(dá)送上了熱搜。6月25日晚間,
Jmeter錄制腳本原理腳本錄制時(shí),Jmeter作為代理網(wǎng)關(guān),通過監(jiān)聽某個(gè)端口
大家好,我是前端西瓜哥,今天我們來了解WebGL的紋理對象(Texture)紋
Python是一門非常流行的編程語言,擁有豐富的第三方庫和工具,這些庫和
一、商業(yè)圈1 小米汽車售價(jià)曝光!起售不到15萬,續(xù)航800km日前媒體獲取
一項(xiàng)新的研究顯示,許多企業(yè)在重命名項(xiàng)目時(shí),不知不覺地將其代碼庫的用
相信大家對水泥混凝土路面裂縫的處理與修復(fù),水泥混凝土路面裂縫處理方
智通財(cái)經(jīng)APP獲悉,有市場觀察人士預(yù)計(jì),今年下半年,美股市場一些消費(fèi)
2023年6月,是我國第22個(gè)“安全生產(chǎn)月”。黨中央高度重視安全生產(chǎn)工作
《我的幻想鄉(xiāng)》是一款由商星奕工作室開發(fā)制作的模擬經(jīng)營游戲新作,目前
一、碑林區(qū)公辦初中招生對象有碑林區(qū)戶籍或?qū)W籍的小學(xué)應(yīng)屆畢業(yè)生、隨遷
交易商品牌 產(chǎn)地交貨地最新報(bào)價(jià)液體重金屬捕捉劑 含量50%河南森蒂環(huán)保