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

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

在控制臺(tái)上不打印接收通道值

在控制臺(tái)上不打印接收通道值

Go
溫溫醬 2021-04-05 17:18:59
我是GoLang的學(xué)習(xí)者,正在嘗試進(jìn)行實(shí)驗(yàn)并了解Sync軟件包和chan概念。我正在運(yùn)行的代碼是期望在控制臺(tái)上打印“接收通道值”的代碼,但是該值未得到打印,它有時(shí)但并非總是打印該值。如果我不使用chan遍歷chan,那么它會(huì)打印所有通道值,但會(huì)失敗,并顯示錯(cuò)誤“致命錯(cuò)誤:所有g(shù)oroutine都處于睡眠狀態(tài)-死鎖! ”我嘗試使用通道“完成”來(lái)同步通道讀取,但是在這種情況下,它再次因相同的錯(cuò)誤而開(kāi)始失敗。我還嘗試了waitGroup API,您可以在我的代碼中看到它(有注釋?zhuān)?,但這對(duì)我沒(méi)有用。謝謝您的幫助源代碼:package mainimport (    "fmt"    "sync")type safeOperation struct {    i int    sync.Mutex}var wg sync.WaitGroupfunc main() {    so := new(safeOperation)    ch := make(chan int)    //done := make(chan bool)    for i := 0; i < 5; i++ {        go so.Increment(ch)        go so.Decrement(ch)    }    go func() {        //wg.Add(1)        for c := range ch {            fmt.Println("Receiving Channel Value: ", c)        }        //wg.Done()        //done <- true    }()    //wg.Wait()    //<-done    fmt.Println("Value: ", so.GetValue())    fmt.Println("Main method finished")}func (so *safeOperation) Increment(ch chan int) {    //so.Lock()    //defer wg.Done()    so.i++    ch <- so.i    //so.Unlock()}func (so *safeOperation) Decrement(ch chan int) {    //so.Lock()    //defer wg.Done()    so.i--    ch <- so.i    //so.Unlock()}func (so *safeOperation) GetValue() int {    so.Lock()    v := so.i    so.Unlock()    return v}輸出: 值:1主要方法完成
查看完整描述

1 回答

?
元芳怎么了

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

一個(gè)很好的使用方式WaitGroup是Add()在發(fā)送到頻道之前先調(diào)用,或者使用go關(guān)鍵字,Done()在從頻道接收后再調(diào)用。這樣Add(),無(wú)論是否在通道塊上發(fā)送,都可以確保始終按時(shí)調(diào)用。


我已經(jīng)更改了您的示例代碼來(lái)做到這一點(diǎn):


package main


import (

    "fmt"

    "sync"

)


type safeOperation struct {

    i int

    sync.Mutex

}


var wg sync.WaitGroup


func main() {

    so := new(safeOperation)

    ch := make(chan int)

    for i := 0; i < 5; i++ {

        wg.Add(1)

        go so.Increment(ch)

        wg.Add(1)

        go so.Decrement(ch)

    }


    go func() {

        for c := range ch {

            fmt.Println("Receiving Channel Value: ", c)

            wg.Done()

        }

    }()

    wg.Wait()

    //<-done

    fmt.Println("Value: ", so.GetValue())

    fmt.Println("Main method finished")

}


func (so *safeOperation) Increment(ch chan int) {

    so.i++

    ch <- so.i

}


func (so *safeOperation) Decrement(ch chan int) {

    so.i--

    ch <- so.i

}


func (so *safeOperation) GetValue() int {

    so.Lock()

    v := so.i

    so.Unlock()

    return v

}


當(dāng)然,您還希望safeOperation.i使用互斥鎖進(jìn)行保護(hù)(否則其值將是不可預(yù)測(cè)的),但這就是獲得所需輸出所必需的全部操作。


查看完整回答
反對(duì) 回復(fù) 2021-04-19
  • 1 回答
  • 0 關(guān)注
  • 241 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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