Allenxuxu / ringbuffer

🚀🚀自动扩容的循环缓冲区实现

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于自动扩容并发安全的疑问

hw676018683 opened this issue · comments

场景:goroutine Agoroutine 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的值就是一个错误的值

并发安全的实现之前有的,被我删除了。
库现在的API都是非线程安全的,如果需要并发操作,自己简单加个锁就可以。

ringbuffer 一般工作在比较底层,可以在上层实现线程安全。在我的另一个项目中有应用, ➡️ https://github.com/Allenxuxu/gev