1 つのスレッド プロデューサーと別のコンシューマーがあると予想されるバイト キューがある場合:
class ByteQueue{
byte[] buf;
/*volatile?*/ int readIdx;
/*volatile?*/ int writeIdx;
Runnable writeListener;
Runnable readListener;
// ...
void write( byte[] b ){
int wr = writeIdx;
int rd = readIdx;
// check consistency and free space using wr+rd
// copy to buf, starting at wr, eventually wrap around
// update writeIdx afterwards
writeIdx = ( wr + b.length ) % buf.length;
// callback to notify consumer for data available
writeListener.run();
}
void read( byte[] b ){
int wr = writeIdx;
int rd = readIdx;
// check consistency and available data using wr+rd
// copy buf to b, starting at rd, eventually wrap around
// update readIdx afterwards
readIdx = ( rd + b.length ) % buf.length;
// callback to notify producer for free space available
readListener.run();
}
int available() { return (writeIdx - readIdx) % buf.length; }
int free() { return buf.length - available() -1; }
// ...
}
このタイプのキューは同期を必要としません。
readIdx はリーダー スレッドによってのみ変更され、
writeIdx はライター スレッドによってのみ変更されます。
readIdx == writeIdx は、コンテンツがないことを意味します。
また、キューは最大 buf.length-1 バイトのデータしか使用できません。
1 つのスレッドだけが 1 つの整数状態の修飾子であるため、揮発性が必要ですか、または省略できますか?
thxフランク