私は、次のサンプルコードは、スレッドセーフであるかどうかを判断しようとしている:のstd ::マップスレッドの安全性とイテレータの無効
std::map<K, V> myMap;
void foo() {
myMap[k]; // Construct a new key-value pair with key `k`.
}
void bar() {
auto it = myMap.find(x);
if (it != myMap.end()) {
std::lock_gaurd<std::mutex> lg(...);
// do something with *it
}
}
(プログラムが終了するまで、少なくとも)起こって何の削除はありません唯一の操作は、foo
に要素を追加し、bar
にそれらを反復することです。関数foo
は1つのスレッドから呼び出され、bar
は同時に複数のスレッドで呼び出されます。
今、STLコンテナはスレッドセーフではないことを理解しており、myMap::operator[]
を使用して非const演算を同時に実行しています。私が混乱しているのは、STL find
は基になるマップを変更しないためで、myMap::operator[]
はイテレータや参照を無効にしないため、安全ではないと考えられますか? operator[]
は非constなので、私はデータ構造を同時に変更しているか、またはイテレータを無効にしないので安全だと考えることができるので心配する必要はありませんか?
不変量は非const関数を呼び出す前後で有効ですが、操作中に*有効であるとは限りません。 –