繁体   English   中英

当您向通道发送一条消息并关闭它时,是否存在数据争用?

[英]Is there is a data race when you send a message to channel and close it?

我遇到了像这样的数据竞赛

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!
}

您所拥有的是各种各样的内容,但是其中一个goroutine关闭,而另一个goroutine正在尝试稍后编写。 种族探测器将其正确报告为数据竞争。

为什么在您的程序中关闭通道?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM