gpt4 book ai didi

go - Go 中并发例程的打印问题

转载 作者:IT王子 更新时间:2023-10-29 01:25:34 25 4
gpt4 key购买 nike

我有三个这样的并发例程,

func Routine1() {

Print (value a, value b, value c)
Print (value a, value b, value c)
Print (value a, value b, value c)

}

func Routine2() {
Print (value e, value f, value g)
Print (value e, value f, value g)
Print (value e, value f, value g)
}
func Routine3() {
Print (value x, value y, value z)
Print (value x, value y, value z)
Print (value x, value y, value z)
}

func main() {
go Routine1(command12, response12, command13, response13)
go Routine2(command12, response12, command23, response23)
Routine3(command13, response13, command23, response23)
}

现在我面临的问题是,有时会发生这样的情况,作为三个并发例程的结果,有时打印语句没有正确执行意味着没有打印完整,有一些东西被另一个打印插入。例如,例程 1 的 Print (value a, value b, value c) 给出像 value a, value b, value g 这样的输出,其中例程 2 插入了值 g。任何人都可以建议我,我该如何停止它?我试过同步互斥程序。但是可能是因为我的代码太长,可能是我无法以正确的方式进行锁定解锁,所以它给出了死锁错误。任何人都可以建议我如何以简单的方式或风险较小的同步互斥程序实现这些。

可以找到关于我的这个问题的更多信息here .

最佳答案

如您所述,打印不是原子操作。不要使用互斥量,而是尝试 Go 方式。将 channel 传递给每个接受字符串的 goroutine。每次你想打印一些东西时,只需将字符串发送到该 channel 即可。

一个单独的 goroutine 只做从该 channel 读取并打印输出的任何内容。这样就不需要锁了。

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup
wg.Add(2) // 2 routines we need to wait for.

stdout := make(chan string)

go routine1(&wg, stdout)
go routine2(&wg, stdout)
go printfunc(stdout)

wg.Wait()

close(stdout)
}

func routine1(wg *sync.WaitGroup, stdout chan<- string) {
defer wg.Done()

stdout <- "first print from 1"
// do stuff
stdout <- "second print from 1"
}

func routine2(wg *sync.WaitGroup, stdout chan<- string) {
defer wg.Done()

stdout <- "first print from 2"
// do stuff
stdout <- "second print from 2"
}

func printfunc(stdout <-chan string) {
for {
select {
case str := <- stdout:
fmt.Println(str)
}
}
}

关于go - Go 中并发例程的打印问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8355795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com