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
と使用が含まれます。たとえば、次のことはしないでください。vector
erase()
vector
mtx.lock();
std::vector<std::string>::iterator i = the_vector.begin();
mtx.unlock();
// 'i' can become invalid if the `vector` is modified.