猿问

环形缓冲区使用&操作是否有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是不是有什么特殊要求,比如奇偶性之类的,望大神解答


陪伴而非守候
浏览 162回答 1
1回答

慕少森

如果你用&,掩码mask就必须满足2n−1环形缓冲区实际上用的是取余操作来保证不爆炸的。如果你用正常的取余%,那么对mask没有要求。如果用按位与&的话,只有mask满足上述条件时,所有二进制位都为1,才能与取余等价。
随时随地看视频慕课网APP
我要回答