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ì)恐慌“只是”阻塞,直到有人從通道接收。
- 1 回答
- 0 關(guān)注
- 124 瀏覽
添加回答
舉報(bào)