Go 当您向频道发送消息并关闭它时,是否存在数据竞争?
我遇到了一场数据竞赛,就像这样Go 当您向频道发送消息并关闭它时,是否存在数据竞争?,go,channel,goroutine,Go,Channel,Goroutine,我遇到了一场数据竞赛,就像这样 WARNING: DATA RACE 11652 Read by goroutine 14: 11653 runtime.chansend() 11654 /usr/local/go/src/pkg/runtime/chan.c:155 +0x0 ... 11657 11658 Previous write by goroutine 13: 11659 runtime.closechan() 11660 /u
WARNING: DATA RACE
11652 Read by goroutine 14:
11653 runtime.chansend()
11654 /usr/local/go/src/pkg/runtime/chan.c:155 +0x0
...
11657
11658 Previous write by goroutine 13:
11659 runtime.closechan()
11660 /usr/local/go/src/pkg/runtime/chan.c:1232 +0x0
...
通道有锁,为什么会有数据竞争?通道关闭后正在写入。即使只有一个goroutine,你也会看到恐慌
package main
func main() {
c := make(chan struct{})
close(c)
c <- struct{}{} // should panic!
}
主程序包
func main(){
c:=make(chan结构{})
关闭(c)
c我看到两个不同的例程,一个正在发送,一个正在关闭。最明显的是数据竞争。你说通道有锁是什么意思?你能显示相关的代码吗?使用同一通道的不同goroutine不应该有数据竞争。通道在其实现中有锁。你需要提供更多的代码。请提供导致数据竞争。没有代码就很难回答有关代码的问题。当单一goroutine场景不会引起恐慌时,可能会发生这种数据竞争。