2

次のコードがあります。

string someVariable;

Parallel.For(0, maxCount, count =>
{
    Parallel.For(0, dimension, row =>
    {
        Parallel.For(0, dimension, col =>
        {
            someVariable = count + " " + row + " " + col;
            DoSomethingIndependent(someVariable);
        });
    });
});

だから私の質問は次のとおりです。ループの外側で宣言されている文字列変数は各反復から独立していますか、それともループの並列実行は互いの間の反復で中断していますか? 「未処理の例外」が発生するため、変数は並列スレッドから同時に使用されると思います。これを行う最善の方法は何ですか?たぶん、並列反復ごとに文字列の配列を使用していますか?
前もって感謝します!

4

1 に答える 1

0

あなたの質問のコードには多くの問題があります。

1)上記のコメントでは誰もこれについて言及していませんが、someVariableは複数のスレッドによって書き込まれています。これにより、正確性の問題が発生します。各タスクが更新する someVariable の独自のインスタンスを持つように、内側のループ内でsomeVariableを宣言する必要があります。

2) 変数が宣言されている場所は、パフォーマンスへの影響を最小限に抑えます。これは、シーケンシャル ループを参照する上記のリンクと同じではありません。ここで、コンパイラは、並列ループ内または並列ループから真のインスタンス化を移動することはできませんが、ループがかなりの量の作業を行っていると仮定すると、変数をインスタンス化するオーバーヘッドは最小限に抑えられるはずです。DoSomethingIndependentが実際の作業を行っていない場合、並列化してもパフォーマンスが向上する可能性はほとんどありません。

3) このようにネストされたループごとに 3 つの並列を使用することは、あまり効率的ではありません。外側のループのそれぞれに並列を設定し、内側の 2 つのループに順次ループを使用する方がよいでしょう。

4)と列がどこかの 2D 配列に格納されたデータを参照すると仮定すると、2 つの内部ループの順序を逆にする必要があります配列は行優先順に格納されることに注意してください。

于 2013-03-28T05:39:32.287 に答える