複数の c++ std::map オブジェクトを保持するグローバル オブジェクトがあります。このオブジェクトは、マルチスレッド環境では読み取り専用であると想定されています。しかし、std::map の実装内で C++ std::map オブジェクトが読み取られているときに書き込み操作があるかどうかはわかりません。IDE は Visual Studio 2008 です。読み取り操作用の同期メカニズムを提供する必要がありますか?
4 に答える
はい、誰も地図に書き込んでいない限り、これは問題ありません。詳細については、こちらをご覧ください。
少なくとも1つの「ポータブル」問題があります。operator[]
読み取りに使用している場合、アイテムがマップにまだ存在しない場合は作成されるという点で、必ずしも読み取り専用操作ではありません。それを超えて、それは特定の実装の問題になります。
下付き文字演算子を使用する場合は、いいえ。下付き文字演算子(map [1])がマップの構造を変更する可能性があります。
ただし、const_iteratorsでfindメソッドを使用する場合は、かなり安全です。マップが変更されると、これらのイテレータがすべて無効になる可能性があることに注意してください。
そうは言っても、それはおそらくまだ危険な考えです。
VC ++ 2008に同梱されているstdライブラリの詳細については、こちらをご覧ください。
単一のオブジェクトは、複数のスレッドから読み取るためにスレッドセーフです。たとえば、オブジェクトAが与えられた場合、スレッド1とスレッド2から同時にAを読み取るのは安全です。
stdコンテナのスレッドセーフに関する規則はありません。それはライブラリ開発者次第です。したがって、特定のstd実装のドキュメントを常に確認してください。