Multithreading 与bufio.NewWriter的竞争条件,但与io.MultiWriter的竞争条件

Multithreading 与bufio.NewWriter的竞争条件,但与io.MultiWriter的竞争条件,multithreading,go,race-condition,goroutine,Multithreading,Go,Race Condition,Goroutine,我正在研究goroutine的安全性,我有下面的代码来说明。当我运行下面的代码时,我检测到一个竞赛条件,这是可以理解的 var buffer1, buffer2 bytes.Buffer // two writers to same buffer writer1 = bufio.NewWriter(&buffer1) writer2 = bufio.NewWriter(&buffer1) c := func(dst io.Writer, src io.Reader) {

我正在研究goroutine的安全性,我有下面的代码来说明。当我运行下面的代码时,我检测到一个竞赛条件,这是可以理解的

var buffer1, buffer2 bytes.Buffer

// two writers to same buffer
writer1 = bufio.NewWriter(&buffer1)
writer2 = bufio.NewWriter(&buffer1)

c := func(dst io.Writer, src io.Reader) {
    io.Copy(dst, src)
}

go c(writer1, os.Stdin)
go c(writer2, os.Stderr)

当我将
bufio.NewWriter
替换为
io.MultiWriter
时,我在运行时得到了一个一次争用条件,如下所示。但是使用竞争条件检测器不会在下面的代码段中显示任何发生的数据竞争

var buffer1, buffer2, buffer3 bytes.Buffer

// two multiwriters writing to buffer3
writer1 = io.MultiWriter(&buffer3, &buffer1)
writer2 = io.MultiWriter(&buffer3, &buffer1)

c := func(dst io.Writer, src io.Reader) {
    io.Copy(dst, src)
}

go c(writer1, os.Stdin)
go c(writer2, os.Stderr)


在我看来,在第二种情况下,
io.MultiWriter
出现了一个可见的竞争条件。它安全吗?为什么很少发生?

如果你很少触发它,它很少发生。数据竞争从来都不是安全的。定义竞争条件,你的输出是什么样子的,你期望什么?谢谢@JimB。我在
go build-race
上使用go race detector构建,但没有检测到任何东西。race detector没有误报,并不意味着它将捕获每一场比赛。@Tega:race detector只检测发生的比赛。同时测试代码仍然取决于您,只是编译代码不会告诉您任何事情。虽然您的代码确实存在争用条件,但可能很难触发,因为在大多数情况下从
os.Stderr
读取是没有意义的。如果您很少触发它,则很少发生这种情况。数据竞争从来都不是安全的。定义竞争条件,你的输出是什么样子的,你期望什么?谢谢@JimB。我在
go build-race
上使用go race detector构建,但没有检测到任何东西。race detector没有误报,并不意味着它将捕获每一场比赛。@Tega:race detector只检测发生的比赛。同时测试代码仍然取决于您,只是编译代码不会告诉您任何事情。虽然您的代码确实存在竞争条件,但可能很难触发,因为在大多数情况下,从
os.Stderr
读取是没有意义的。