5

ブースト ロックフリー サイズが 65535 オブジェクトに固定されているのはなぜですか?

typedef boost::lockfree::queue<int, boost::lockfree::fixed_size<true>> MyQueue;
MyQueue queue(1024*100);

上記のコードは例外をスローします。

私がコードで見つけた理由は、配列ベースのフリーリストが 16 ビットのアドレス空間しかサポートしていないということです。

これの理由は何ですか?私は64ビットのLinuxマシンで使用しています。では、なぜアドレス指定を 2**16 アイテムに制限するのでしょうか? キューはインデックス作成に「short int」を使用しますか? アトミック命令は 16 ビット ワード サイズでのみ機能しますか?

これよりも多くの容量を持つ固定サイズのキューを作成するにはどうすればよいですか?

4

1 に答える 1

3

ロックフリー リストのブースト実装は、ABA 問題と戦わなければなりません。tag一般的な回避策は、検討中の数量に余分なビットを追加することです。さらに、Boost は 32 ビット アーキテクチャで実行する必要があります。つまり、アトミックに操作できるのは 32 ビット値のみです。

32 ビットの値を分割すると、16 ビットのポインターと 16 ビットのタグを格納できます。符号なし 16 ビット値は、65535 の異なる値に制限されています。

于 2013-08-19T10:42:12.477 に答える