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

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

一個(gè)通道有一個(gè)接收者和未知數(shù)量的 goroutines 發(fā)送者導(dǎo)致死鎖

一個(gè)通道有一個(gè)接收者和未知數(shù)量的 goroutines 發(fā)送者導(dǎo)致死鎖

Go
慕俠2389804 2023-06-01 14:59:13
我有一個(gè)頻道,接收器是主要的。我生成了多個(gè) goroutine,每個(gè) goroutine 通過(guò)通道發(fā)送一個(gè)字符串?,F(xiàn)在,這會(huì)導(dǎo)致死鎖,因?yàn)槲覜](méi)有使用 close 函數(shù)正確關(guān)閉通道。問(wèn)題是,我不知道將創(chuàng)建多少 goroutines,因此無(wú)法知道何時(shí)關(guān)閉通道。我試過(guò)使用 WaitGroup,問(wèn)題是,我讀到我不能在 goroutine 中使用 Add,我應(yīng)該在主進(jìn)程/goroutine 中使用 wg.Add(1),我試過(guò)使用 Add in父 goroutine 產(chǎn)生子 goroutine,這也導(dǎo)致了死鎖包主import (    "fmt"    "sync")var i = 0func doSomething(ch chan string, wg sync.WaitGroup) {    defer wg.Done()    ch <- fmt.Sprintf("doSomething: %d", i)    i++    if i == 10 {return}    wg.Add(1)    go doSomething(ch, wg)}func main() {    ch := make(chan string)    var wg sync.WaitGroup    wg.Add(1)    go doSomething(ch, wg)    wg.Wait()    for s := range ch {        fmt.Println(s)    }}現(xiàn)在,這只是一個(gè)測(cè)試代碼,所以,假設(shè)我們不知道我們將只創(chuàng)建 10 個(gè) goroutines,假設(shè)它在運(yùn)行時(shí)是未知的,如果我不使用,我會(huì)立即得到一個(gè)沒(méi)有任何輸出的死鎖錯(cuò)誤WorkGroup 我在打印第 10 個(gè)字符串之前收到錯(cuò)誤(因?yàn)槲覜](méi)有關(guān)閉通道)我還嘗試過(guò)不為每個(gè)函數(shù)調(diào)用生成一個(gè) goroutine,而是對(duì)所有遞歸調(diào)用(從 main 開(kāi)始)使用一個(gè) goroutine,并關(guān)閉通道,我為 go 創(chuàng)建了一個(gè)匿名函數(shù),它首先調(diào)用 doSomething 函數(shù)然后調(diào)用關(guān)閉,所以所有的遞歸調(diào)用都會(huì)被評(píng)估,我們肯定知道什么時(shí)候關(guān)閉通道。但是,這就是我現(xiàn)在想要完成的,我試圖讓未知數(shù)量的 goroutine 一起工作,并在它們以某種方式完成后關(guān)閉通道。
查看完整描述

1 回答

?
蕭十郎

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

有幾個(gè)問(wèn)題。


第一個(gè)是程序在將它們作為參數(shù)傳遞時(shí)復(fù)制等待組值。復(fù)制時(shí)等待組不能正常工作。而是將指針傳遞給等待組。


第二個(gè)問(wèn)題是 main 在從通道接收值之前等待所有 goroutines 完成。因?yàn)橥ǖ赖木彌_區(qū)不夠大,無(wú)法容納所有發(fā)送的值,所以程序會(huì)死鎖。


第三個(gè)問(wèn)題是通道上方的主要范圍,但沒(méi)有任何東西關(guān)閉通道。Main 不會(huì)因此退出。


要解決第二個(gè)和第三個(gè)問(wèn)題,請(qǐng)啟動(dòng)另一個(gè) goroutine 等待doSomthings 并在完成后關(guān)閉通道。


嘗試這個(gè):


func doSomething(ch chan string, wg *sync.WaitGroup) {

    defer wg.Done()

    ch <- fmt.Sprintf("doSomething: %d", i)

    i++

    if i == 10 {

        return

    }

    wg.Add(1)

    go doSomething(ch, wg)

}


func main() {

    ch := make(chan string)

    var wg sync.WaitGroup

    wg.Add(1)

    go doSomething(ch, &wg)

    go func() {

        wg.Wait()

        close(ch)

    }()

    for s := range ch {

        fmt.Println(s)

    }

}


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

添加回答

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