go 语言并发编程中通道接收顺序的不确定性
本文分析 Go 语言并发编程中,从通道 (channel) 接收数据的顺序问题。以下代码示例阐述了这一问题:多个 goroutine 向同一个通道发送数据,主 goroutine 从该通道接收数据,接收顺序并非发送顺序。

<code class="go">package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 接收顺序不确定
fmt.Println(x, y)
}</code>代码中,两个 goroutine 并发执行 sum 函数,分别计算切片 s 前半部分和后半部分的和,并将结果发送到通道 c。主 goroutine 从 c 接收两个值,赋值给 x 和 y。然而,x 和 y 的值并非总是对应第一个和第二个发送到通道的值。
这种现象的原因是 Go 语言中赋值语句 x, y := <-c, <-c 的并行执行特性。<-c 从通道 c 接收数据,由于两个 goroutine 发送数据的时机存在不确定性,因此 <-c 的执行顺序也无法预知,导致 x 和 y 的值与发送顺序不一致。
理解 Go 语言赋值运算符的并行特性对于理解和运用其并发特性至关重要。忽略此特性,容易造成对程序运行结果的误解。 为了保证接收顺序,需要使用同步机制,例如使用带缓冲的通道或其他同步原语。
以上就是Go并发编程中,通道接收顺序为什么不确定?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号