鍍金池/ 問答/C  C++  Linux/ 環(huán)形緩沖區(qū)使用&操作是否有BUG?

環(huán)形緩沖區(qū)使用&操作是否有BUG?

1.使用環(huán)形緩沖區(qū),進(jìn)行數(shù)據(jù)交換,threadWrite -> buf -> threadRead
threadWrite{

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

}

threadRead{

...

}

若mask == 2, pushCount從0開始累加
當(dāng)pushCount = 0
pushCount & mask == 0
當(dāng)pushCount = 1
pushCount & mask == 0
當(dāng)pushCount = 2
pushCount & mask == 2

這是不是出問題了呢,數(shù)組的第二個(gè)位置沒寫入,第一個(gè)位置被寫了兩遍

2.環(huán)形隊(duì)列的掩碼mask是不是有什么特殊要求,比如奇偶性之類的,望大神解答

回答
編輯回答
落殤

如果你用&,掩碼mask就必須滿足 $$ 2^n - 1 $$

環(huán)形緩沖區(qū)實(shí)際上用的是取余操作來保證不爆炸的。如果你用正常的取余%,那么對mask沒有要求。如果用按位與&的話,只有mask滿足上述條件時(shí),所有二進(jìn)制位都為1,才能與取余等價(jià)。

2017年4月24日 01:56