关于自动扩容并发安全的疑问
hw676018683 opened this issue · comments
Mechanicwei commented
场景:goroutine A
和goroutine B
同一时间读和写,B写的时候发现空间不足,进行扩容
func (r *RingBuffer) makeSpace(len int) {
newSize := r.size + len
newBuf := make([]byte, newSize)
oldLen := r.Length()
_, _ = r.Read(newBuf)
r.w = oldLen
r.r = 0
r.size = newSize
r.buf = newBuf
}
这里是先读出来,这时候A同时读,
情况一:A先读完,r.r = 0
生效,是不是就会造成一段数据重复读
情况二:B先读完, r.r
的值就是一个错误的值
Allen Xu commented
并发安全的实现之前有的,被我删除了。
库现在的API都是非线程安全的,如果需要并发操作,自己简单加个锁就可以。
ringbuffer 一般工作在比较底层,可以在上层实现线程安全。在我的另一个项目中有应用, ➡️ https://github.com/Allenxuxu/gev