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

在 2 个 goroutine 之间同步

在 2 个 goroutine 之间同步

Go
牧羊人nacy 2022-11-23 14:11:01
我的任务是同步 2 个 goroutines 所以输出应该是这样的:foobarfoobarfoobarfoobar.问题是,当我打电话给他们时,他们完全随机出现。这是我的代码: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贡献1801条经验 获得超15个赞

如评论中所述,使用 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贡献1772条经验 获得超7个赞

使用频道:


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
  • 2 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

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