2

boost::unordered_map<const std::string, std::list<TypeA> >パフォーマンスが重要なマルチスレッド環境でを使用しています。STL コンテナーへの書き込みはスレッド セーフではないことを理解していますboost::unordered_map

boost::unordered_map<const std::string, std::list<TypeA> > myMap;
// Added some elements to myMap        

ここで、タイプ A の要素を としてリストに追加または削除する場合、他のスレッドが残りの部分を読み書きできるように、変更中のリストをロックするのではなく、マップ全体をロックする必要がありますか?キーと値のペア?

// Assuming there are pair with the keys "Apple" and "Orange" in myMap
      A a, b;
      myMap["Orange"].push_back(a) //Add an element to the list
      myMap["Apple"].remove(b); //Remove an element 

リストが別の STL コンテナーに置き換えられた場合はどうなるでしょうか。

ありがとう。

4

2 に答える 2

1

[unordered_]マップ自体ではなく、含まれているオブジェクトのみを変更しているため、含まれているオブジェクトのみをロックする必要があります。を別のシーケンス (deque または vector など) に変更した場合もlist、同じことが当てはまります。含まれているオブジェクトの型を変更しても、含まれているオブジェクトのみを変更し、それを含むマップは変更していないという事実は変わりません。 .

于 2012-08-17T20:46:59.090 に答える
1

ここでロックを実行する必要はありません。キーが既に存在することが保証されている場合、それらへのアクセスはロックを必要としない非変更操作です (他の誰も変更していない限り)。また、各リストは独立しています。他の誰もmyMap["Apple"]同時にアクセスしていない限り、あなたは最高です。もちろん、複数のスレッドから安全に変更できるロックレス リストや、concurrent_unordered_mapTBB や PPL に見られるような .

于 2012-08-17T20:50:27.587 に答える