web-dev-qa-db-ja.com

C ++ 11 STLコンテナーとスレッドセーフティ

これに関する最新情報を見つけるのに苦労しています。

C++ 11バージョンのSTLコンテナーには、ある程度のスレッドセーフが保証されていますか?

パフォーマンス上の理由から、そうではないと思われます。しかし、それで、両方があるのはそのためです std::vector::operator[] および std::vector::at

39
Let_Me_Be

既存の回答ではカバーされていないので(コメントだけがカバーしています)、現在の C++標準仕様 の23.2.2 [container.requirements.dataraces]に言及します。

実装は、vector<bool>を除く同じシーケンスの異なる要素に含まれるオブジェクトのコンテンツが同時に変更された場合に、データの競合を回避するために必要です。

つまり、同じコンテナの個別の要素にアクセスしても安全です。たとえば、10個の要素のグローバルstd::vector<std::future<int>>を持ち、それぞれがベクトルの異なる要素に書き込む10個のスレッドを持つことができます。

それとは別に、 Mr.C64's answer が示すように、標準ライブラリの他の部分と同じルールがコンテナに適用されます(17.6.5.9 [res.on.data.races]を参照)。 [container.requirements.dataraces]は、要素への非const参照のみを返し、実際には何も変更しないため、安全に呼び出すことができるコンテナのいくつかの非constメンバー関数をリストします(一般的に、非constメンバー関数は変更と見なされます。)

39
Jonathan Wakely

STLコンテナは、次の基本的なスレッドセーフ保証を提供すると思います。

  • 同時読み取り同じオブジェクトのOK

  • 同時読み取り/書き込み of 異なるオブジェクトはOK

しかし、何か別のこと、たとえば、同じオブジェクトへの同時書き込み。

26
Mr.C64