0

私はフォームのコレクションを持っています:

map<key, list<object> >

リストの最後に挿入するだけで、マップ全体から読み取ることもあります(ただし、初期化時を除いて、マップに書き込むことはありません)。

私が理解しているように、どのSTLコンテナーもスレッドセーフではありませんが、実際には、キーごとに最大1つのスレッドしか持つことができません。この配置でかなり安全だと仮定して、何かが足りませんか?

4

2 に答える 2

7

マルチスレッドのシナリオでマップがまったく変更されない場合は、問題ありません。各スレッドが独自のリストを参照する場合、それはスレッド プライベート データなので、問題ありません。

[] でキーを検索しようとしないように注意してください。キーがまだマップに存在しない場合に挿入 (変更) されるからです。

しかし、なぜこの構造が必要なのか興味があります。各スレッドにプライベートであることを考えると、ポインター/参照または実際のリストオブジェクト自体を各スレッドのスタックに保持しないのはなぜですか?

(そうでない場合は、リストで適切な同期が必要です。)

実際、「マップ全体から読み取る」と言います。おそらく、ランダムなスレッドがリストのいずれかを反復しようとする可能性があることを意味します。したがって、リストの操作を同期する必要があります。

于 2009-07-13T17:11:36.947 に答える
1

TBH 書き込みと読み取りの周りにクリティカル セクションを配置する限り、正常に動作します。

于 2009-07-13T17:11:22.953 に答える