2011-11-22 33 views
8

これはスレッドセーフティstd::mapです。現在、同時読み取りはスレッドセーフですが、書き込みは実行されません。私の質問は、毎回マップにユニークな要素を追加すると、スレッドセーフなのでしょうか?私はこのstd:map<int, std::string> myMap ようなマップを持っているとした場合C++マップのスレッドセーフ

  1. ので、例えば、私は常に新しいキーを追加し、決して既存のキーと値を変更していない、それはスレッドセーフになりますか?

  2. もっと重要なのは、私にランダムなランタイム動作を与えますか?

  3. 新しいキーを追加することも変更と見なされますか?追加中にキーが常に異なる場合、メモリの独立した部分を変更するため、スレッドセーフではないでしょうか?

おかげもちろん シブ

+0

いいえ、これはスレッドセーフではありません。なぜなら、2つのスレッドが同じ場所に入る2つの(一意の)アイテムを同時に追加できるからです。 –

+0

標準のコンテナから期待できるスレッド安全性の唯一の種類は、コンテナが決して変更されず、各スレッドが** different **要素にアクセス(読み取りまたは書き込み)した場合、それはうまくいくはずです。 –

答えて

14

1)ない

2)はい、私はあなたがいない、後で

3)はい、それは、テスト中にそれに遭遇していただければ幸いです。新しい要素は別の場所に追加されますが、その間に多くのポインタが変更されます。

マップは、すべての実装ではなくても、ほとんどの場合、ある種のツリーによって実装されます。ツリーに新しい要素を挿入すると、異なるノードを指すようにポインタをリセットすることによって、ノードを並べ替えることによって変更されます。スレッドセーフではありません

+1

+1、正確には... –

+0

@armen次に、最良の選択肢は何ですか? –

+0

@EdwinVivekN:STLコンテナを同時に操作する場合は、外部同期メカニズム(例:mutex)を使用する必要があります –

0

いいえ、はい、はいです。コンテナを変更するときは、新しいキーの挿入を含む排他ロックを取得する必要がありますが、変更は一切ありませんが、同時に安全に読み取ることができます。

編集:http://www.sgi.com/tech/stl/thread_safety.htmlがあなたにとって有益かもしれません。

関連する問題