web-dev-qa-db-ja.com

C ++の非ブロッキングスレッドセーフキュー?

C++にスレッドセーフで非ブロッキングのキュークラスはありますか?

おそらく基本的な質問ですが、私は長い間C++を実行していません...

編集: STL要件を削除しました。

25
jldupont

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;
};

残りは多かれ少なかれ私がリンクしたアルゴリズムの転写です...

17
asveikau

現在のC++標準はスレッドの存在さえ認識していないため、STLまたは標準ライブラリの他の部分にはスレッドセーフなものはありません。

6
sbi

これは、昨年のドブ博士の人気のあるテーマだったようです。

6
Clifford

自分で実装するか、実装するライブラリを使用する必要があります。自分でそれを行うには、これを見てみたいと思うかもしれません:

条件変数を使用したスレッドセーフキューの実装

2
KeatsPeeks

STLコンテナはスレッドセーフではないため、同時アクセスの処理を実装する必要があります。
同時アクセスを提供することを目的としたこのプロジェクト(C++)があります: CPH STL
および 論文について

1
lsalamon

短い答え-いいえ。 STLは、(少なくとも仕様レベルでは)並行性には関係しません。現在のC++標準では、スレッドについては何も述べていません。

STLとBoostの上にこのようなキューを簡単に作成できますが、カスタムクラスでstd::queueboost::mutexをラップするだけです。

1

今では手遅れかもしれません。将来の参考のために、これはロックフリーキューの優れた実装です(いくつかの注意点がありますが、スレッドセーフが組み込まれています)。

マルチプロデューサー-マルチコンシューマー

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++

https://github.com/cameron314/readerwriterqueue

1

現在非公式 Boost.Lockfree は考慮すべきことです。 FIFOとアトミックタイプの両方を使用します。

0
Matt Chambers