环形缓冲区使用&操作是否有BUG?

1.使用环形缓冲区,进行数据交换,threadWrite -> buf -> threadRead
threadWrite{

memcpy(buf[pushCount & mask], value, size);
pushCount++;
...

}

threadRead{

...

}

若mask == 2, pushCount从0开始累加
当pushCount = 0
pushCount & mask == 0
当pushCount = 1
pushCount & mask == 0
当pushCount = 2
pushCount & mask == 2

这是不是出问题了呢,数组的第二个位置没写入,第一个位置被写了两遍

2.环形队列的掩码mask是不是有什么特殊要求,比如奇偶性之类的,望大神解答

阅读 2.5k
1 个回答

如果你用&,掩码mask就必须满足 $$ 2^n - 1 $$

环形缓冲区实际上用的是取余操作来保证不爆炸的。如果你用正常的取余%,那么对mask没有要求。如果用按位与&的话,只有mask满足上述条件时,所有二进制位都为1,才能与取余等价。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题