私はSTLベクトルを反復処理し、そこから値を読み取ります。このベクトルに変更を加えることができる別のスレッドがあります。今、他のスレッドがベクトルを挿入または削除し、要素をベクトルから削除すると、イテレータは無効になります。ロックの使用はありません。イテレータの代わりにインデックス(アプローチ1)を使用してコンテナにアクセスする方法(アプローチ2)はスレッドセーフであるか?パフォーマンスはどうですか?C++ STLベクトル反復子とインデックスとアクセスとスレッドの安全性
struct A{int i; int j;};
アプローチ1:
size_t s = v.size();//v contains pointers to objects of type A
for(size_t i = 0; i < s; ++i)
{
A* ptr = v[i];
ptr->i++;
}
アプローチ2:
std::vector<A*>::iterator begin = v.begin();
std::vector<A*>::iterator end = v.end();
for(std::vector<A*>::iterator it = begin; it != end; ++it)
{
A* ptr = *it;
ptr->i++:
}
+1 C/C++の標準ライブラリでは、スレッドセーフであるとはみなされません。しかし、POSIXで定義された関数はスレッドセーフであると定義されています。 – sj755
@ seljuq70:あなたの声明は間違っています。最新のstnadards更新がリリースされる前は本当でしたが、CとC++の両方でスレッドセーフの保証が提供されています。あなたが望むものではないかもしれませんが、それはライブラリの構造がスレッドセーフでないことを意味するものではありません。さまざまなクラスは実際には多くの人がスレッドセーフであると誤解しているように見えるモニター(ほとんどの場合)です。 –
@DietmarKühl私のメモを見て、それはあなたが絶対に正しいと思われる。ほぼすべてのシステムとライブラリ関数はスレッドセーフであると考えられています。また、すべてのPOSIX関数がスレッドセーフであるというのは間違っていました。例えば、readdirとstrerrorはスレッドセーフであるとは限りません(私は可能であると想定していますが)。 – sj755