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;
};
次に、命令をラップしますlock cmpxchg{8|16}b
インラインasmを使用...
たぶん、あなたはこのようにキューノードを書くことができます:
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とアトミックタイプの両方を使用します。