ドキュメントには別途記載されています( "反復範囲内の値ごとにボディ代理人が1回呼び出されます)。Parallel.For同じアクション(同じインデックス)を複数回実行できますか?
しかし、同じアクションが別のスレッドによって多かれ少なかれ同時に実行されている場合には、説明される動作を観察しました。
私は最も簡単なオーバーロードについて質問しています:Parallel.For(Int32, Int32, Action<Int32>)
。
ドキュメントには別途記載されています( "反復範囲内の値ごとにボディ代理人が1回呼び出されます)。Parallel.For同じアクション(同じインデックス)を複数回実行できますか?
しかし、同じアクションが別のスレッドによって多かれ少なかれ同時に実行されている場合には、説明される動作を観察しました。
私は最も簡単なオーバーロードについて質問しています:Parallel.For(Int32, Int32, Action<Int32>)
。
いいえ、は値ごとに1回実行してください。他の場所で、複数のアクション間で変数を共有している場所を見てみましょう。私は99.99%のあなたの行動を見つけるでしょうはが同じ引数で2回実行されていません。
Parallel.Forはアクションを複数回呼び出さなかった。その代わりに、Parallel.Forは、ロックオブジェクトの宣言が悪いため(グローバル/静的であったはずのローカル/インスタンス)、それ自体と並行して呼び出されていました。したがって、同じアクションは実際には異なるスレッドによって多かれ少なかれ同時に実行されていました。残念ながら、この問題の報告では、実際に別のインスタンス(同じベースタイプから派生したインスタンスなので、両方ともParallel.Forを含む同じメソッドを持っていた)でエラーが発生したと主張していました。とりあえずありがとう。 –
TPLが壊れていないことを望むのではなく、自分のコードで問題を探す方がよいでしょう。これがTPLのエッジ機能であるのとは異なり、非常に主流です。観察された行動には他にどんな説明がありますか?何も飛び出さない限り、デリゲートにデバッグコードを追加してください。 –
@スティーブ、すべての点で敬意を表して、私が "壊れている"と思ったのはTPLではなく、ドキュメンテーションでした。特定のデリゲートを並列に呼び出すことができる.NET(_e.g._、競合の初期化)の場所はいくつかあります。はい、アクションではなくFuncですが、以前は.NETに驚いていました。尋ねることに害はない(または私は思った)。 –
@WillMontgomeryのTPLは、競合状態などのスレッド問題を回避するように設計されています。つまり、自分のコードを慎重に扱う必要はありませんが、ライブラリ関数が期待どおりに動作するかどうかを顔に依存することができます。 – svick