1

std::map工場で作成されたオブジェクトを保存してアクセスを提供するために使用するフライウェイトパターンがシリアルで機能しています。ファクトリはiterator、マップ内のオブジェクトを指すを返します。ファクトリ内のオブジェクトは定数であるため、一度挿入すると、消去されない限り更新されません。

を使用してファクトリを同時に作成したいのtbb::concurrent_hash_mapですが、返品がどうあるべきかわかりません。を使用することもできますがiterator(そうする必要がありますconst_iteratorか?)、ドキュメントには、何かがfindまたはinsertで実行されると、すべてのイテレータが無効になると記載されていconcurrent_hash_mapます。したがって、読み取り専用アクセスのみが必要なため、を使用できますが、これはシリアル実装( vs )const_accessorとは異なります。iteratoraccessor

どちらを使用するのが良いですか?タイプ(つまり、両方のイテレータ)の一貫性が重要ですか?シリアルとスレッドの両方のコンパイル時オプションが存在する必要があります。

4

1 に答える 1

2

マップにアクセスする他のスレッドと同時に要素を消去しない場合は、tbb::concurrent_unordered_map代わりに使用できます。これもハッシュベースの連想コンテナですが、よりシンプルでSTLに似たAPIを備えています。とによってイテレータを無効にすることはありませが、トレードオフとして、要素を同時に削除することはできません。insertfind

要素を同時に削除する必要がある場合、TBBでの唯一の選択はtbb::concurrent_hash_map、アクセサーで使用することです。

また、TBBフォーラムでユースケースについて話し合うことをお勧めします。

于 2012-01-17T21:02:03.830 に答える