12

ここで、C++ の標準コンテナー (「リスト」や「マップ」など) がスレッドセーフであるかどうかという質問を含む多くの投稿を読みましたが、それらのすべてが一般的ではないと述べています。並列読み取りは問題ないはずですが、並列書き込みまたは並列読み取りと書き込みは問題を引き起こす可能性があります。

今、www.cplusplus.comで、ほとんどの操作中にリストにアクセスしたり変更したりしても安全であることがわかりました。

いくつかの例:

マップ::検索

コンテナーにアクセスします (const バージョンも非 const バージョンもコンテナーを変更しません)。マップされた値はアクセスされません。要素への同時アクセスまたは変更は安全です。

マップ::挿入

コンテナが変更されます。既存の要素に同時にアクセスすることは安全ですが、コンテナー内の範囲を反復することは安全ではありません。

cplusplus.com を誤解していますか、それとも std コンテナーのスレッド セーフについて知っておくべきことは他にありますか?

前もって感謝します!

PS: 私は C++11 ではなく C++03 を求めています

4

4 に答える 4

6

ほぼ正しいように聞こえます。

map実際の値を変更する場合、複数のスレッドからの値へのアクセスも保護する必要があることに注意してください。2 つのスレッドが異なるエントリを更新することがわかっている場合 (挿入/削除を意味するわけではありません)、安全です。

于 2013-09-06T11:57:25.260 に答える
2

C++11 より前は、標準に「スレッド」という概念はありませんでした。したがって、コンテナーがスレッドセーフかどうかという問題は、C++03 のコンテキストでは無意味です。

于 2013-09-06T11:56:04.290 に答える
0

Marcin が指摘したように、C++03 にはスレッドの概念がありません。したがって、書き込みが完全に完了した後の 2 つのスレッドでの同時読み取りであっても、スレッドセーフな操作を想定することはできません。

このケースについて考えてみましょう: t=0 でスレッドを作成し、A を呼び出しましょう。t=10 秒で、スレッド B (スレッド A が作成される前に存在します) がコンテナーに書き込みます。t=1 時間に、スレッド A と B の両方が、サードパーティのライブラリ (pthread など) を介して同期を行わずにコンテナーを読み取ろうとします。

C++03 は、スレッド B が正しい値を参照することのみを保証します。しかし、C++03 はすべてのプログラムがシングル スレッドであることを想定しているため、スレッド A が正しい値を認識するという保証はありません。スレッド)。

于 2013-09-06T13:35:33.350 に答える