1

最大値から始まる for ループを並列化してからデクリメントすることは可能ですか? Parallel.For署名では、「i」がインクリメントする場合のみのようです

for (int i = Int32.MaxValue; i >= 0; --i)
{
    // do something...
}

よろしく、

フロリアン

4

4 に答える 4

4

並列コードを書いているかどうかは問題ではありません:

MSFTは、ループが低から高へ、または特定の順序で実行されることを保証しません。

注: Parallel.For メソッドは、特定の実行順序を保証するものではありません。シーケンシャル ループとは異なり、一部の高値のインデックスが一部の低値のインデックスの前に処理される場合があります。

実際には、Parallel.For は絶対に順番どおりに実行され ません。

Jeppe Stig Nielsen の例を考えてみましょう (コメントから):

System.Threading.Tasks.Parallel.For(0, 25, i => { Console.WriteLine(i); });

4 コアのマシンでは、次の出力が得られました。

0
1
2
4
5
7
8
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
3
9
6

明らかに、ループは適切ではありません。

于 2012-08-07T08:43:05.377 に答える
1

いいえ。ただし、ループ カウンターから派生インデックスを作成することはできます。

Parallel.For(0, Int32.MaxValue, (i) => 
{ 
    int derivedIndex = Int32.MaxValue - i;
});
于 2012-08-07T08:41:01.853 に答える
0
....
int nTot = aRwRemove.Count - 1;
Parallel.For( 0, nTot, i =>
    {
        aRwRemove[nTot - i].Delete();
    }
);
----
于 2016-11-23T11:51:02.690 に答える
-1

forループ内で減少する値を計算することで簡単に達成できます。

for (int j = 0; j < Int32.MaxValue; j++)
{
    var i = Int32.MaxValue - j;
    // do something...
}
于 2012-08-07T08:41:30.827 に答える