47

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

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

パフォーマンス上の理由から、そうではないことを期待しています。std::vector::operator[]しかし、繰り返しますが、それがとの両方がある理由std::vector::atです。

4

3 に答える 3

44

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

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

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

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

于 2012-10-17T16:08:36.570 に答える
28

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

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

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

ただし、同じオブジェクトへの同時書き込みなど、別のことを実行する場合は、何らかの形式のカスタム同期(クリティカルセクションなど)を使用する必要があります。

于 2012-10-17T10:08:38.350 に答える
-7

いいえ。スレッドセーフなSTLのようなコンテナについては、PPLまたはIntelTBBを確認してください。

他の人が指摘しているように、彼らは通常の「マルチリーダースレッドセーフ」を持っていますが、それはC++11以前ですらあります。多くの場合、これは単一のライター、複数のリーダーを意味するものではありません。それは0人の作家を意味します。:)

于 2012-10-17T10:09:13.660 に答える