当您向频道发送消息并关闭它时,是否存在数据竞争?

时间:2014-10-24 06:08:47

标签: 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       /usr/local/go/src/pkg/runtime/chan.c:1232 +0x0
            ...

频道有锁定,为什么会有数据竞争?

1 个答案:

答案 0 :(得分:1)

关闭后正在写入一个频道。即使只有一个goroutine,你也会感到恐慌。

package main

func main() {
    c := make(chan struct{})
    close(c)
    c <- struct{}{}  // should panic!
}

你所得到的是各种各样的,但是有一个goroutine关闭,另一个goroutine试图写后。竞赛检测器正在将此报告为数据竞赛。

为什么您的程序中的频道已关闭?