3 回答

TA貢獻(xiàn)1111條經(jīng)驗(yàn) 獲得超0個(gè)贊
通常,不要陷入認(rèn)為更大的緩沖區(qū)可以修復(fù)死鎖的陷阱。這種方法可能在某些特定情況下有效,但通常并非如此。
死鎖最好通過(guò)了解 goroutine 如何相互依賴來(lái)解決。本質(zhì)上,您必須消除相互依賴的通信循環(huán)。非阻塞發(fā)送的想法(參見@izca 的回答)是一種有用的技巧,但不是唯一的技巧。
有大量關(guān)于如何避免死鎖/活鎖的知識(shí)。其中大部分來(lái)自?shī)W卡姆在 80 年代和 90 年代流行的日子。有一些來(lái)自諸如 Jeremy Martin(無(wú)死鎖并發(fā)系統(tǒng)的設(shè)計(jì)策略)、Peter Welch(高級(jí)范式)等人的特別珍寶。
客戶端-服務(wù)器策略很簡(jiǎn)單:將您的 Go 例程網(wǎng)絡(luò)描述為一組通信服務(wù)器及其客戶端;確保網(wǎng)絡(luò)圖中沒有循環(huán) => 消除了死鎖。
I/o-par 是一種形成 Go-routines 的環(huán)和環(huán)的方法,這樣結(jié)構(gòu)內(nèi)就不會(huì)出現(xiàn)死鎖;這就是循環(huán)特定情況下是允許的,但行為方式一般無(wú)死鎖的方式。
所以,我的策略是首先減少緩沖區(qū)大小,考慮發(fā)生了什么,修復(fù)死鎖。然后,根據(jù)基準(zhǔn)重新引入緩沖區(qū)以提高性能。死鎖是由通信圖中的循環(huán)引起的。打破循環(huán)。

TA貢獻(xiàn)2080條經(jīng)驗(yàn) 獲得超4個(gè)贊
您的節(jié)目陷入僵局,因?yàn)槟念l道已滿。
您的頻道大小為 1。然后調(diào)用wg.Wait()
.. 等待調(diào)用5 個(gè)函數(shù)?,F(xiàn)在,一旦您到達(dá)err3
.. rand == 3
,因此您的頻道會(huì)傳遞錯(cuò)誤。
此時(shí),您的頻道已滿,您只勾選了 3 個(gè)等待組項(xiàng)目。
err4
使用值 3 .. 調(diào)用它也想在您的頻道上放置錯(cuò)誤。此時(shí),它會(huì)阻止 - 因?yàn)槟念l道已滿并且沒有從中彈出任何內(nèi)容。
所以你的主要 goroutine 會(huì)阻塞,因?yàn)槟愕牡却M永遠(yuǎn)不會(huì)完成。
修復(fù)確實(shí)是使您的通道緩沖區(qū)更大。這樣,當(dāng)錯(cuò)誤試圖放置在通道上時(shí) - 它不會(huì)阻塞,并且您的等待組有機(jī)會(huì)勾選它的所有項(xiàng)目。
- 3 回答
- 0 關(guān)注
- 185 瀏覽
添加回答
舉報(bào)