戈朗的字节。一个写入器/一个读取器的缓冲线程安全性



我知道Golang的bytes.Buffer不是线程安全,但是如果我有一个作家(在Goroutine中)和一个读者(在另一个Goroutine中)。安全吗?

如果不是,那为什么不是呢?从一开始阅读时,将附加物写入缓冲区,因此我看不到他们将访问相同内存位置的情况。

不,这不是安全的。

bytes.Buffer是一个结构,Buffer.Read()Buffer.Write()方法均读取/修改相同结构值的相同字段(它们具有指针接收器)。仅此一项就足以不安全地使用。有关更多详细信息,请参阅同时读取功能指针而无需锁定的功能指针吗?

还考虑一下bytes.Buffer在字节切片中存储字节,该字节是结构的一个字段。在写作时,有时可能有时需要分配更大的缓冲区(如果切片容量不够),因此必须更改切片标头(切片结构字段)(在Write()中)。没有同步,无法保证并发Read()会看到此。

和...即使不需要重新分配(因为基础字节切片具有足够的能力来容纳传递给Write()的数据),将数据存储在字节切片中需要重新安装它,因此即使将其更改,也会更改。不需要重新分配(切片的长度也是切片标头的一部分)。要查看Slice标题中的内容,请查看reflect.SliceHeader类型。

最新更新