質問
C ++にはスレッドセーフな非ブロッキングキュークラスがありますか?
おそらく基本的な質問ですが、私は長い間C ++をやっていない...
編集: STL要件を削除しました。
解決
CPUにダブルポインター幅の比較とスワップ(486以上のcompxchg8b、ほとんどのamd64マシンのcompxchg16b [Intelの初期モデルにはない])があると仮定します...アルゴリズムがありますこちら。
更新:少しの作業をすることを恐れないのであれば、これをC ++に翻訳するのは難しくありません。 :P
このアルゴリズムは、「タグ付きポインタ」を想定しています。このような構造:
// Be aware that copying this structure has to be done atomically...
template <class T>
struct pointer
{
T *ptr;
uintptr_t tag;
};
次に、いくつかのインラインasmで命令 lock cmpxchg {8 | 16} b
をラップします...
たぶん、次のようにキューノードを書くことができます:
template <class T>
struct queue_node
{
T value;
pointer<queue_node<T> > next;
};
残りは多かれ少なかれ私がリンクしたアルゴリズムの転写です...
他のヒント
現在のC ++標準ではスレッドの存在さえ認識されていないため、STLや標準ライブラリの他の部分にはスレッドセーフなものはほとんどありません。
これは、ドブ博士の昨年の人気のテーマだったようです:
自分で実装するか、実装するライブラリを使用する必要があります。自分でそれを行うには、これを見てみたいと思うかもしれません:
簡単な答え-いいえ。 STLは(少なくとも仕様レベルでは)並行性に関心がありません。現在のC ++標準はスレッドについては何も述べていません。
ただし、STLとBoostの上にこのようなキューを簡単に構築できます。カスタムクラスで std :: queue
と boost :: mutex
をラップするだけです。
もう手遅れかもしれません。将来の参考のために、これはロックフリーキューの適切な実装です(いくつかの注意事項とともにスレッドセーフに組み込まれています)。
マルチプロデューサー-マルチコンシューマー
http:// moodycamel。 com / blog / 2014 / a-fast-general-purpose-lock-free-queue-for-c ++
https://github.com/cameron314/concurrentqueue
単一のプロデューサー-単一のコンシューマー
http://moodycamel.com/blog/ 2013 / a-fast-lock-free-queue-for-c ++
現在非公式の Boost.Lockfree は考慮すべきこと。 FIFOとアトミックタイプの両方を使用します。