2010-11-30 20 views
3

私はBoostからunordered_mapを使用しています。 unordered_mapの同期バージョンはありますか?これは、私がかなり多くのunordered_mapを持っていて、ロックを使ってそれを手動で同期させるのが非常に面倒であるからです。C++でunordered_mapを同期

ありがとうございました。

答えて

7

STLのようなインターフェイス(unordered_mapも同様)を提供するコンテナを自動ロックで便利にカプセル化することは不可能です。これは、イテレータと文字列内の位置を取得し、その後の操作で使用しようとする競合条件があるためです。複雑な操作を単一のロックされた関数呼び出しにするなど、必要に応じて柔軟性の低いインタフェースを見つけることができれば、スレッドセーフなクラスをコンテナの周りに簡単にラップして使用を簡単にすることができます。

1

インテルのThread Building Blocksライブラリーは、並行アクセスを可能にする順序付けされていないマップであるクラスtbb::concurrent_hash_mapを持っています。内部的にはきめ細かいロックスキームを使用して実装されていますが、基本的な結果は競合条件なしでアクセスできることです。

4

本当に必要なのですか?

while (!stack.empty()) 
{ 
    Element const e = stack.top(); 


    stack.pop(); 
} 

1つのスレッドでは、このコードは正しく表示されます。ただし、マルチスレッドにしたい場合は、単にスタックを同期させるだけではそれをカットしません。

空白をテストした後で他の誰かが最後の要素をポップするとどうなりますか?

マルチスレッド化にはコンテナ同期以上のものがあります。つまり、あなたはTBBを試すことができます。

2

フォリーのAtomicHashmapを使用してください。 Githubの

Folly's documentationから

は愚か/ AtomicHashmap.hは大きくマルチスレッド環境(約2-5x TBBより速く:: concurrent_hash_map)と優れたメモリ使用量の性質に極端なパフォーマンスのために設計された同期UnorderedAssociativeContainerの実装を紹介します。検索と反復には待ちがなく、挿入にはキーレベルのロックの細分性があり、最小のメモリオーバーヘッドがあり、永続的な32ビットIDを使用して各要素を参照できます。

でも、limitationsが付属しています。

関連する問題