vector、すべてのSTLコンテナと同様に、スレッドセーフではありません。同期を自分で明示的に管理する必要があります。またははstd::mutex、boost::mutexへのアクセスを同期するために使用できますvector。
フラグはスレッドセーフではないため、使用しないでください。
- スレッドAは
isInUseフラグの値をチェックします。false
- スレッドAは中断されています
- スレッドBは
isInUseフラグの値をチェックします。false
- スレッドBはに設定
isInUseしますtrue
- スレッドBは中断されています
- スレッドAが再開されます
- スレッドAはまだそうだと考え
isInUseてfalse設定しますtrue
- スレッドAとスレッドBの両方がアクセスできるようになりました
vector
vector各スレッドは、それを使用する必要がある間ずっとをロックする必要があることに注意してください。これには、イテレータが参照する要素が内部再割り当てであるか、内部再割り当てが行われる場合にイテレータが無効になる可能性があるため、イテレータの変更vectorと使用が含まれます。たとえば、次のことはしないでください。vectorerase()vector
mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();
// 'i' can become invalid if the `vector` is modified.