如何解决为什么它不能交替打印值
我写了一个退出和同步队列
预期打印如下,但没有发生, 将 g1 或 g2 连续打印两个值 我知道无缓冲通道同步规则,但我似乎误解了它
g1 0
g2 1
g1 1
g2 1
g1 2
g2 2
go playground print alternatively code snippet
package main
import (
"fmt"
)
func main() {
exit := make(chan struct{})
transfer := make(chan int)
go func() {
defer func() {
close(exit)
}()
for i := 0; i < 20; i++ {
transfer <- i
fmt.Println("g1\t",i) // 1
}
}()
go func() {
for i := 0; i < 20; i++ {
<-transfer
fmt.Println("g2\t",i) // 3 4
}
}()
<-exit
}
解决方法
因此,当您使用无缓冲通道时,它是一个阻塞事务;发生的情况是两个 go 例程都停止在某个点并需要进行事务;一旦交易发生;现在两个 goroutine 都可以继续前进了,调度器需要决定哪个 goroutine 先运行,g1 和 g2 打印顺序相同的可能性不是 100%。
,那是因为这里有数据采集。
你不能确定之后
transfer <- i
和 fmt.Println("g1\t",i) // 1
之前不应有上下文切换到另一个例程。
所以如果你希望这是原子的,你应该在这里添加另一个同步机制
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。