为了账号安全,请及时绑定邮箱和手机立即绑定

在 2 个 goroutine 之间同步

在 2 个 goroutine 之间同步

Go
牧羊人nacy 2022-11-23 14:11:01

我的任务是同步 2 个 goroutines 所以输出应该是这样的:


foobarfoobarfoobarfoobar


.问题是,当我打电话给他们时,他们完全随机出现。这是我的代码:


package main


import (

    "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贡献1531条经验 获得超14个赞

如评论中所述,使用 goroutines 可能不是您要实现的目标的最佳用例 - 因此这可能是一个XY 问题。


话虽如此,如果你想确保两个独立的 goroutines 以交替顺序交错它们的工作,你可以实现一组“乒乓”互斥锁:


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


查看完整回答
反对 回复 2022-11-23
?
料青山看我应如是

TA贡献1496条经验 获得超6个赞

使用频道:


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


查看完整回答
反对 回复 2022-11-23

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信