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是不是有什么特殊要求,比如奇偶性之类的,望大神解答
如果你用
&
,掩码mask就必须满足 $$ 2^n - 1 $$环形缓冲区实际上用的是取余操作来保证不爆炸的。如果你用正常的取余
%
,那么对mask没有要求。如果用按位与&
的话,只有mask满足上述条件时,所有二进制位都为1
,才能与取余等价。