第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何停止所有等待sync.Cond的goroutine?

如何停止所有等待sync.Cond的goroutine?

Go
GCT1015 2022-06-13 16:57:21
我寫(xiě)了一個(gè)隊(duì)列類type Queue struct {    data     []interface{}    cond     *sync.Cond}func New() Queue {    return Queue{        data:     []interface{}{},        cond:     sync.NewCond(&sync.Mutex{}),        chanStop: make(chan interface{}),    }}func (q *Queue) Push(val interface{}) {    q.cond.L.Lock()    q.data = append(q.data, val)    q.cond.Signal()    q.cond.L.Unlock()}func (q *Queue) Pop() (interface{}, bool) {    q.cond.L.Lock()    for len(q.data) == 0 {        q.cond.Wait()    }    retVal := q.data[0]    q.data = q.data[1:]    q.cond.L.Unlock()    return retVal, true}func (q *Queue) Close() {}如果隊(duì)列為空,Pop()調(diào)用者將被阻塞。有什么方法可以停止等待Pop()被任何 Cond 調(diào)用阻塞的所有例程?當(dāng)然我可以做類似的事情type Queue struct {    data     []interface{}    cond     *sync.Cond    chanStop chan interface{}}func (q *Queue) Pop() (interface{}, bool) {    var retVal interface{}    retFlag := false    select {    case <-q.chanStop:    case <-func() <-chan interface{} {        out := make(chan interface{})        go func() {            defer close(out)            q.cond.L.Lock()            for len(q.data) == 0 {                q.cond.Wait()            }            retVal = q.data[0]            retFlag = true            q.data = q.data[1:]            q.cond.L.Unlock()        }()        return out    }():    }    return retVal, retFlag}func (q *Queue) Close() {    close(q.chanStop)}但也許有一些方法可以在沒(méi)有這些select冗長(zhǎng)的情況下停止等待?
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超3個(gè)贊

您可以使用 喚醒所有等待的客戶端Pop(),但是如果為空并且沒(méi)有任何內(nèi)容可返回Cond.Broadcast(),您還必須處理。q.data

此外,如果隊(duì)列關(guān)閉后客戶端繼續(xù)調(diào)用Pop(),您還需要檢查隊(duì)列之前是否已關(guān)閉,并且不進(jìn)入等待狀態(tài)而是提前返回。

通常sync.Cond文檔不足,它與其他 Go 同步模式(例如select)不兼容,并且許多人認(rèn)為它不是 Go 中有用的同步原語(yǔ),并且可能會(huì)在 Go 2 中被刪除,請(qǐng)參閱詳細(xì)信息

可以使用通道來(lái)代替sync.Cond,例如關(guān)閉對(duì)應(yīng)的通道,在對(duì)應(yīng)Cond.Broadcast()的通道上發(fā)送一個(gè)值Cond.Signal()。

回到你的例子。最簡(jiǎn)單的并發(fā)安全隊(duì)列本身就是一個(gè)緩沖通道。推操作是在通道上發(fā)送,彈出操作是從通道接收。通道對(duì)于并發(fā)使用是安全的。

緩沖通道“不知道”的一件事是它具有固定的緩沖區(qū)大小,并且一旦創(chuàng)建,緩沖區(qū)大小就無(wú)法更改。盡管如此,我認(rèn)為事先分配一個(gè)大緩沖區(qū)而不用擔(dān)心以后的任何事情是一個(gè)很小的代價(jià)。在緩沖區(qū)已滿的通道上發(fā)送不會(huì)恐慌“只是”阻塞,直到有人從通道接收。


查看完整回答
反對(duì) 回復(fù) 2022-06-13
  • 1 回答
  • 0 關(guān)注
  • 124 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)