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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 2 個 goroutine 之間同步

在 2 個 goroutine 之間同步

Go
牧羊人nacy 2022-11-23 14:11:01
我的任務(wù)是同步 2 個 goroutines 所以輸出應(yīng)該是這樣的:foobarfoobarfoobarfoobar.問題是,當(dāng)我打電話給他們時,他們完全隨機出現(xiàn)。這是我的代碼:package mainimport (    "fmt"    "sync"    "time")type ConcurrentPrinter struct {    sync.WaitGroup    sync.Mutex}func (cp *ConcurrentPrinter) printFoo(times int) {    cp.WaitGroup.Add(times)    go func() {        cp.Lock()        fmt.Print("foo")        cp.Unlock()    }()}func (cp *ConcurrentPrinter) printBar(times int) {    cp.WaitGroup.Add(times)    go func() {        cp.Lock()        fmt.Print("bar")        cp.Unlock()    }()}func main() {    times := 10    cp := &ConcurrentPrinter{}    for i := 0; i <= times; i++ {        cp.printFoo(i)        cp.printBar(i)    }    time.Sleep(10 * time.Millisecond)}
查看完整描述

2 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗 獲得超16個贊

如評論中所述,使用 goroutines 可能不是您要實現(xiàn)的目標(biāo)的最佳用例 - 因此這可能是一個XY 問題。


話雖如此,如果你想確保兩個獨立的 goroutines 以交替順序交錯它們的工作,你可以實現(xiàn)一組“乒乓”互斥鎖:


var ping, pong sync.Mutex


pong.Lock() // ensure the 2nd goroutine waits & the 1st goes first


go func() {

    for {

        ping.Lock()

        foo()

        pong.Unlock()

    }

}()


go func() {

    for {

        pong.Lock()

        bar()

        ping.Unlock()

    }

}()

https://go.dev/play/p/VO2LoMJ8fek


查看完整回答
反對 回復(fù) 2022-11-23
?
料青山看我應(yīng)如是

TA貢獻(xiàn)1772條經(jīng)驗 獲得超8個贊

使用頻道:


func printFoo(i int, ch chan<- bool, wg *sync.WaitGroup) {

    wg.Add(1)

    go func() {

        defer wg.Done()

        fmt.Print("foo")

        ch <- true

    }()

}

func printBar(i int, ch chan<- bool, wg *sync.WaitGroup) {

    wg.Add(1)

    go func() {

        defer wg.Done()

        fmt.Print("bar")

        ch <- true

    }()


}


func main() {

    times := 4

    firstchan := make(chan bool)

    secondchan := make(chan bool)

    var wg sync.WaitGroup

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

        printFoo(i, firstchan, &wg)

        <-firstchan

        printBar(i, secondchan, &wg)

        <-secondchan

    }

    wg.Wait()

}

https://go.dev/play/p/MlZ9dHkUXGb


查看完整回答
反對 回復(fù) 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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