登录
首页 >  Golang >  Go问答

实现两个 goroutine 的同步

来源:stackoverflow

时间:2024-03-06 14:39:26 178浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《实现两个 goroutine 的同步》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我的任务是同步 2 个 goroutine,因此输出应如下所示:

foob​​arfoobarfoobarfoobar

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

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)
}

正确答案


正如评论中所述,使用 goroutine 可能不是您想要实现的目标的最佳用例 - 因此这可能是 XY problem

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

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

使用频道:

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

今天关于《实现两个 goroutine 的同步》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>