2012-01-25 7 views
1

C++ 11プログラムのメインスレッドでは、std::setを作成し、アイテムを入力してイテレータitを抽出したとします。その後、別のスレッドから、要素を追加できるだけでなく、消去されないようにセットを変更します。イテレータの有効性とスレッド

itの妥当性は、セットが変更されている間も保証されていますか?または、セットが他のスレッドからの挿入操作によって変更されている間にitが無効であると考えるべきですか?セクション23.2.1 [container.requirements.general]から

+0

良い:[反復子無効化](http://stackoverflow.com/questions/6438086/iterator-invalidation-rules) –

+0

@Als:しかし、スレッド化にはまったく対応していません。 –

+1

@BenVoigt:はい、それでは、重複したものではなく、良い読み取りとして追加しました:) –

答えて

3

特に断りのない限り(明示的に、または他の機能の点で関数を定義することによって)、容器のメンバ関数を呼び出すか、ライブラリの引数としてコンテナを渡しますそのコンテナ内のオブジェクトにイテレータを無効化したり、その値を変更してはならない。このようstd::setとして連想コンテナについては

は、セクション23.2.4([associative.reqmts])は言う:

insertemplaceメンバーはならないFF ECTコンテナへのイテレータと参照の有効性、およびeraseメンバーイテレータと消去された要素への参照のみを無効にするものとします。

したがって、イテレータは追加アイテムを挿入した後も有効です。

しかし、スレッドの安全性は全く別のトピックです。

セクション17.6.5.9([res.on.data.races])基礎となるコンテナにアクセスすることができますが、それを修正してはならない、標準ライブラリコンテナまたは文字列のメンバ関数を呼び出すことによって取得したイテレータに

操作することを提供します。

それが更新されていながら、それはコンテナの読み込みになりますので、別のスレッドからコレクションに挿入しながらstd::setイテレータを使用することは必ずしも安全ではありません。あなたの実装はより強い保証を提供するかもしれません。

+0

これはシングルスレッドモデルの下にあります。 'i ++'のような並行操作を実行すると、中間状態が無効なイテレータにつながる可能性があります。 – spraff

+0

多分私はここで髪を分割していますが、これらの保証には、イテレータがコンテナメンバ関数の呼び出しの_any_点で無効化されていないことが含まれますか?つまり、インプリメンテーションがinsert()の呼び出し中にイテレータを無効にし、メソッドを終了する前に再検証することを妨げているのは何ですか? – bluescarni

+0

@bluescarni:前述のとおり、スレッドの安全性は別のトピックです。私は以来、私がコントロールする必要があると考えているものを追加しました。 –

関連する問題