0

通常は問題なく動作するマルチスレッド コードがありますが、頻繁に壊れます。私は問題を特定しようとしていますが、OpenMP を使用するとそれが難しくなります (問題はシリアルでは発生しません)。変数への複数アクセス (競合状態) がしばしばプログラムをクラッシュさせることを知っています。

複数のスレッド間で共有されているリストがあり、そのリストの push_back() が競合状態の候補であるかどうかに興味があります。そのため、時々プログラムがクラッシュしますか? もしそうなら、これを処理する方法に関する推奨事項はありますか?
- 速度が最も重要です
- を使用すると競合状態が解決されることはわかってい#pragma omp criticalますが、アプリケーションの速度が低下する可能性があります (リストが 2 つあるため、アトミックではなくクリティカルが必要です)。

これについてよくわからない唯一の理由は、stl コンテナーを使用していくつかのテストを実行したが、テスト コードがクラッシュしなかったためです。

どんな提案でも大歓迎です!
前もって感謝します、

4

2 に答える 2

1

免責事項: 特に OpenMP については何も知りません。ただし、2 つのスレッドが同時にリストに対して push_back (またはその他の変更操作) を実行すると、単一の変数の場合と同じように問題が発生すると言えます。

これを防ぐためにOpenMPが提供するツールはわかりません。この問題を回避するためのいくつかの一般的なアプローチ:

  1. 変数の操作をロック (例: ミューテックス) します。
  2. 各スレッドに独自のリストのコピーを与え、独立したままにします。プロセスの最後に、別のステップとして、異なるスレッドからの結果をマージできます。(これはほぼ Map-Reduce です)。

2 番目のアプローチは、多数のスレッドがあり、アルゴリズムに適合する場合に、より良い結果をもたらす可能性があります。一部のアルゴリズムは、そのように構造化することはできません。

スレッドの数が少ない場合、ループ本体のサイズによっては、単純なロックが最も効果的なソリューションになる場合があります。

于 2010-05-28T13:12:29.140 に答える
0

STLコンテナは本質的にスレッドセーフではありません。同期メカニズムを使用して、それらへのアクセスを保護する必要があります。典型的なものはセマフォまたはミューテックスであり、ミューテックスは一般に2つのうち速い方です。

于 2010-05-28T13:05:58.980 に答える