LENSHOOD/go-lock-free-ring-buffer

元素个数无法确保一致性

tchen-coder opened this issue · 2 comments

image 你好,这种方式区控制ring slice 元素容量,无法保证添加和读取数据的原子性。 1.如果当前只能容纳一个元素,此时2个goroutine执行Offer操作,isFull会存在2个goroutine都会条件通过,这种情况就会存在问题。

Hi,感谢你的提问。

根据代码,这里的 isFull() 的确是不保证只有单个线程通过的,实际的临界区,趋近于在 !atomic.CompareAndSwapUint64(&r.tail, oldTail, newTail 这行代码开始后才开始,因此在这行以及之前的代码,都是可以存在多个线程执行的。

不知道我是否正确理解了你的问题,如果理解有偏差,还请多提供多信息,我们再做探讨,谢谢!

嗯,对的。