最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang?sync.Cond同步機(jī)制運(yùn)用及實(shí)現(xiàn)

 更新時(shí)間:2023年09月27日 10:35:36   作者:lincoln_hlf1  
在?Go?里有專(zhuān)門(mén)為同步通信而生的?channel,所以較少看到?sync.Cond?的使用,不過(guò)它也是并發(fā)控制手段里的一種,今天我們就來(lái)認(rèn)識(shí)下它的相關(guān)實(shí)現(xiàn),加深對(duì)同步機(jī)制的運(yùn)用

sync.Cond

Go同步通信channel

sync.Cond 提供了三個(gè)方法:Wait()、Signal()、Broadcast(),它們的用法如下:

  • Wait():阻塞當(dāng)前的 goroutine,等待喚起。
  • Signal():?jiǎn)酒鹨粋€(gè)阻塞的 goroutine。
  • Broadcast():?jiǎn)酒鹚凶枞?goroutine。

通過(guò)上面的方法描述,我們就可以簡(jiǎn)單的實(shí)現(xiàn)一個(gè)任務(wù)池功能:先批量的創(chuàng)建 goroutine,然后調(diào)用 sync.Cond 的 Wait() 方法讓其阻塞的等待。

當(dāng)有一個(gè)任務(wù)到來(lái)時(shí),則通過(guò) Signal() 喚起剛剛在阻塞的某一個(gè) goroutine,去執(zhí)行任務(wù)。

通過(guò)任務(wù)池功能,我們發(fā)現(xiàn) sync.Cond 的運(yùn)用很簡(jiǎn)單,但 Go 官方并不推薦我們使用 sync.Cond 來(lái)實(shí)現(xiàn)協(xié)程間的同步通信。

因?yàn)樗⒉环?Go 官方 “通過(guò)通信來(lái)共享內(nèi)存” 的設(shè)計(jì)思想,當(dāng)場(chǎng)景復(fù)雜時(shí),則會(huì)耦合各個(gè)業(yè)務(wù)功能。

sync.Cond 源碼分析

我們來(lái)看下 sync.Cond 的結(jié)構(gòu)體,代碼在 /sr/sync/cond.go 下:

type Cond struct {
    noCopy noCopy       // 不可復(fù)制
    L Locker            // 鎖
    notify  notifyList  // 通知喚起列表
    checker copyChecker // 復(fù)制檢測(cè)
}

可以看到 Cond 上有 notify 列表,而這正是維護(hù)了需要喚起的 goroutine 列表。

當(dāng)我們調(diào)用 Wait() 方法的時(shí)候就會(huì)維護(hù)當(dāng)前 goroutine 到對(duì)應(yīng)的 notifyList 里:

func (c *Cond) Wait() {
    c.checker.check()
    t := runtime_notifyListAdd(&c.notify) // 將當(dāng)前 goroutine 添加到 notifyList 里
    c.L.Unlock()
    runtime_notifyListWait(&c.notify, t) // 阻塞等待
    c.L.Lock()
}

當(dāng)有其他協(xié)程調(diào)用了 Signal 或 Broadcast 方法時(shí),則會(huì)通過(guò)runtime_notifyListNotifyOneruntime_notifyListNotifyAll方法來(lái)喚起一個(gè)或多個(gè) goroutine。

其他同步方式的實(shí)現(xiàn)

前面提到到 sync.Cond 并不被推薦作為協(xié)同通信手段,那如果要實(shí)現(xiàn)它的單播、廣播效果,該怎么弄呢?

其實(shí)也很簡(jiǎn)單,如果我們要實(shí)現(xiàn)單播效果,那么只需要通過(guò)阻塞的監(jiān)聽(tīng) channel 信號(hào)即可。

如果要實(shí)現(xiàn)廣播喚起效果,只需要利用 context 的鏈?zhǔn)饺∠匦裕材苓_(dá)到該效果。

以上就是golang sync.Cond同步機(jī)制運(yùn)用及實(shí)現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于golang sync.Cond同步機(jī)制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

城市| 尚义县| 祥云县| 晋城| 张掖市| 鄂伦春自治旗| 文安县| 罗江县| 道孚县| 河源市| 桂阳县| 自贡市| 拉孜县| 玉门市| 景德镇市| 庆阳市| 乌兰浩特市| 旬阳县| 阿坝县| 厦门市| 岐山县| 华亭县| 苏尼特左旗| 宁武县| 桃园市| 谢通门县| 泗阳县| 成安县| 河南省| 孝昌县| 古浪县| 宽甸| 全椒县| 黄山市| 当阳市| 永兴县| 普格县| 郓城县| 东山县| 蒲城县| 台中县|