12

重複の可能性:
C++ STL std::set はスレッドセーフですか?
STL キューのスレッド セーフ

そうではないと思いますが、確認したいだけです。orを同時に使用して同じstd::deque を使用する 2 つのスレッドを意味します。std::deque::push_backpush_front

std::priority_queue関数std::priority_queue::pushstd::priority_queue::pop..についても同じ質問があります。

それらのコンテナーはスレッドセーフですか? または、スレッドセーフになるように個人的にプログラムする必要がありますか?

Tnxたくさん。

4

3 に答える 3

17

Scott Myer の効果的な STL アイテム 12 から。STL コンテナーのスレッド セーフについて現実的な期待を持て

複数のリーダーは安全です。複数のスレッドが 1 つのコンテナーの内容を同時に読み取ることができますが、これは正しく機能します。当然、読み取り中にコンテナーで動作するライターがあってはなりません。

異なるコンテナへの複数のライターは安全です。複数のスレッドが異なるコンテナーに同時に書き込む場合があります。

スレッド セーフと STL コンテナーに関しては、1 つのコンテナーで複数のリーダーを使用し、別のコンテナーで複数のライターを使用できるライブラリの実装が期待できます。ライブラリによって手動の同時実行制御が不要になることは期待できません。また、スレッド サポートにまったく頼ることもできません。

于 2010-11-05T12:52:30.327 に答える
3

STL は、スレッドの安全性を保証しません。これは、複数のスレッドから同じコンテナーを変更する場合に特に当てはまります。

使用している STL の実装は、ある程度のスレッド セーフを提供する場合がありますが、実装のドキュメントを参照する必要があります。

于 2010-11-05T12:48:32.837 に答える
1

それらがスレッドセーフであると言うとき、おそらく、何もロックすることなく複数のスレッドでそれらを使用できることを意味します。

理論的には、2 つのスレッドが存在する可能性があり、1 つは後方にプッシュし、もう 1 つは前方にプッシュします。おそらくそれでうまくいくでしょうが、実装者はイテレータがスレッドセーフになる保証がないため注意が必要です。 push_back の実装が「end」を使用し、push_front の実装が「begin」を使用した場合、そのような実装は他のスレッドによる呼び出しで無効になり、爆発する可能性があります。

std::priority_queue は、おそらくプロデューサー/コンシューマー スレッドの場合、1 つのプッシュと 1 つのポップで、2 つのスレッドで一緒に使用することはほぼ確実ではなく、最初にロックする必要があります。

std::deque に基づいてプロデューサー/コンシューマー キューを作成したときに、プロデューサーが一度に複数のアイテムをプッシュし、コンシューマーがキュー全体をスイープして処理できるようにしたことがわかりました。これは、一括挿入ごとに 1 つのロックのみを意味するため、ロックに必要な回数が減りました。

于 2010-11-05T12:53:07.643 に答える