gpt4 book ai didi

go - 在 Go 中使用简单 channel 的竞争条件?

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

我是 Go 的新手,我被一个看起来有点罕见的竞争条件难住了,其中有一小段代码在 Linux Go 1.2 版上运行。

基本上,我为 int 创建一个 channel ,启动一个 go 例程以从该 channel 读取数据,然后将一个 int 写入该 channel 。

package main

import "fmt"

func main() {
channel := make(chan int)

go func() {
number := <- channel
fmt.Printf("GOT IT: %d\n", number)
}()

fmt.Println("[+] putting num on channel")
channel <- 42
fmt.Println("[-] putting num on channel")
}

大约 90% 的时间输出符合预期:

$ go run test.go 
[+] putting num on channel
GOT IT: 42
[-] putting num on channel

然而,大约有 10% 的时间,go 例程根本不从 channel 中读取数字并且不打印任何内容:

$ go run test.go 
[+] putting num on channel
[-] putting num on channel

我很困惑,因为这段代码与 https://gobyexample.com/channels 中的示例非常相似,(我没有这个问题)除了我在我的 go 例程中从 channel 读取而不是写入 channel 。

我是否对 channel 的运作方式存在根本性的误解,或者是否还有其他因素在起作用?

最佳答案

您应该等到您的 goroutine 执行,然后您可以使用 sync.WaitGroup 执行它:

package main

import (
"fmt"
"sync"
)

func main() {
var wg sync.WaitGroup

channel := make(chan int)
wg.Add(1)

go func() {
number := <-channel
fmt.Printf("GOT IT: %d\n", number)
wg.Done()
}()

fmt.Println("[+] putting num on channel")
channel <- 42
wg.Wait()
fmt.Println("[-] putting num on channel")
}

(去玩:http://play.golang.org/p/VycxTw_4vu)

您也可以使用“通知 channel ”来完成,这表明工作已完成:

package main

import "fmt"

func main() {
channel := make(chan int)
done := make(chan bool)

go func() {
number := <-channel
fmt.Printf("GOT IT: %d\n", number)
done <- true
}()

fmt.Println("[+] putting num on channel")
channel <- 42
<-done
fmt.Println("[-] putting num on channel")
}

(去玩:http://play.golang.org/p/fApWQgtr4D)

关于go - 在 Go 中使用简单 channel 的竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451595/

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