Golang的bytes.Buffer线程安全性为一个作家/一个读者

Kee*_*eto 3 io buffer go slice

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

如果没有,那为什么不呢?写操作从读取开始读取时附加到缓冲区,因此我没有看到它们将访问相同内存位置的情况.

icz*_*cza 9

不,这不安全.

bytes.Buffer是一个结构,并且两个Buffer.Read()和Buffer.Write()方法的读/修改同一结构值(它们具有指针接收器)的相同的字段.仅此一项就足以对并发使用不安全.有关更多详细信息,请参阅在没有锁定的情况下同时读取函数指针是否安全?

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

并且......即使不需要重新分配(因为底层字节片具有足够的容量来容纳传递给的数据Write()),将数据存储在字节片中需要重新分配它,因此即使不需要重新分配,片头也会改变(切片的长度也是切片头的一部分).要查看切片标头中的内容,请查看reflect.SliceHeader类型.