1

これで、concurrent_vector または queue に一連の自己定義データ型オブジェクトを保持する必要があるソルバーができました。オブジェクトは異なるスレッドから取得されるため、並行処理する必要があります。この並行コンテナーを使用して、これらのオブジェクトを並べ替え、重複を排除し、他のスレッドがそれらを必要とするときにそれらを送り返したいと考えています。

ただし、TBB が、異なるスレッドから同時に読み書きできる concurrent_vector と concurrent_queue を提供していることは知っています。しかし、コンテナ内のオブジェクトをソートするにはどうすればよいでしょうか? 誰もがそれを行う方法を知っていますか? ありがとう。

4

3 に答える 3

3

TBB 並行コンテナーについて誤解していると思います。TBB wikiを参照できます

TBB 並行コンテナーは OS 同期オブジェクトを使用しますか?

  • いいえ、そうではありません。TBB 並行コンテナーは、TBB ユーザーレベルの同期プリミティブとアトミック操作を利用します。

tbb::concurrent_vectorロックせずに要素にアクセスして変更するのはスレッドセーフですか?

  • いいえ、明示的にロックを使用する必要があります。

したがって、concurrent_vector は、スレッドセーフなマルチスレッドの読み取りと書き込みをサポートしていません。これが助けになることを願っています。

于 2011-10-04T23:45:15.957 に答える
1

concurrent_vector は std::sort で動作し、tbb と ppl (サンプル パック内) の両方が、これで使用できる並列並べ替えを提供します。std::unique の並列バージョンは、重複を削除するのにさらに便利ですが、独自に構築する必要があります。

于 2011-10-14T22:33:19.693 に答える
1

生産者スレッドは消費者スレッドと同時に実行する必要があると思います。したがって、要素をソートして一意にする必要がない場合は、単純な concurrent_queue で十分です。

それらを一意にする必要がある場合は、tbb::concurrent_hash_mapそのために a を使用できます。

ただし、本当に要素を並べ替えたい場合は、かなり複雑で tbb には存在しない、concurrent_set (順序付き) のようなものが必要です。したがって、これらの要素を本当にソートする必要がある場合は、要素をコンテナー (std::set など) に配置し、そこから取得するために取得する必要がある単純なロックを使用することを提案します。

于 2010-12-08T16:25:31.650 に答える