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

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

我怎樣才能避免死鎖

我怎樣才能避免死鎖

Go
拉風(fēng)的咖菲貓 2021-09-13 10:07:43
看下面的代碼片段。package mainimport (    "errors"    "fmt"    "math/rand"    "runtime"    "sync"    "time")func random(min, max int) int {    rand.Seed(time.Now().Unix())    return rand.Intn(max-min) + min}func err1(rand int, chErr chan error, wg *sync.WaitGroup) {    if rand == 1 {        chErr <- errors.New("Error 1")    }    wg.Done()}func err2(rand int, chErr chan error, wg *sync.WaitGroup) {    if rand == 2 {        chErr <- errors.New("Error 2")    }    wg.Done()}func err3(rand int, chErr chan error, wg *sync.WaitGroup) {    if rand == 3 {        chErr <- errors.New("Error 3")    }    wg.Done()}func err4(rand int, chErr chan error, wg *sync.WaitGroup) {    if rand == 3 {        chErr <- errors.New("Error 4")    }    wg.Done()}func err5(rand int, chErr chan error, wg *sync.WaitGroup) {    if rand == 4 {        chErr <- errors.New("Error 5")    }    wg.Done()}func main() {    runtime.GOMAXPROCS(runtime.NumCPU())    chErr := make(chan error, 1)    wg := new(sync.WaitGroup)    //n := random(1, 8)    n := 3    fmt.Println(n)    wg.Add(5)    go err1(n, chErr, wg)    go err2(n, chErr, wg)    go err3(n, chErr, wg)    go err4(n, chErr, wg)    go err5(n, chErr, wg)    fmt.Println("Wait")    wg.Wait()    select {    case err := <-chErr:        fmt.Println(err)        close(chErr)    default:        fmt.Println("NO error, job done")    }}我怎樣才能避免這里的僵局?我可以指定緩沖區(qū)長(zhǎng)度為 2,但也許它有更優(yōu)雅的方法來(lái)解決問(wèn)題。我有意識(shí)地在函數(shù) err3 和 err4 上做了 rand == 3 。
查看完整描述

3 回答

?
catspeake

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í)范式)等人的特別珍寶。

  1. 客戶端-服務(wù)器策略很簡(jiǎn)單:將您的 Go 例程網(wǎng)絡(luò)描述為一組通信服務(wù)器及其客戶端;確保網(wǎng)絡(luò)圖中沒有循環(huán) => 消除了死鎖。

  2. 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)。


查看完整回答
反對(duì) 回復(fù) 2021-09-13
?
犯罪嫌疑人X

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)目。


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

添加回答

舉報(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)