我正在研究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
发生了明显的竞争状况。安全吗?为什么很少发生?