3

私は説明できない奇妙な問題に直面しています。あなたの何人かが私に欠けている答えを持っているかどうか知りたい.

私は、はるかに大きなコードに加えているマルチスレッドの変更をテストするための小さなテスト アプリを持っています。このアプリでは、2 つの関数を設定しました。1 つは順次ループを実行し、もう 1 つは Task.Parallel.For を使用します。それらの 2 つは、生成された time 要素と final 要素を出力します。私が見ているのは、Parallel.For を実行する関数がシーケンシャル ループよりも少ない項目を生成していることです。これは実際のアプリにとって大きな問題です (いくつかの最終結果を台無しにしています)。だから、私の質問は、誰かがなぜこれが起こっているのか、もしそうなら、それを修正する方法があるかどうかです.

テスト アプリで parallel.for を使用する関数のコードを次に示します。

static bool[] values = new bool[52];

static List<int[]> combinations = new List<int[]>();

static void ParallelLoop()
{
    combinations.Clear();
    Parallel.For(0, 48, i =>
    {
        if (values[i])
        {
            for (int j = i + 1; j < 49; j++)
                if (values[j])
                {

                    for (int k = j + 1; k < 50; k++)
                    {

                        if (values[k])
                        {

                            for (int l = k + 1; l < 51; l++)
                            {
                                if (values[l])
                                {
                                    for (int m = l + 1; m < 52; m++)
                                    {
                                        if (values[m])
                                        {
                                            int[] combination = { i, j, k, l, m };
                                            combinations.Add(combination);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
        }

    }); // Parallel.For
}

アプリの出力は次のとおりです。

Executing sequential loop...
Number of elements generated: 1,712,304
Executing parallel loop...
Number of elements generated: 1,464,871

事前に感謝します。説明が必要な場合は、さらに詳しく説明するために最善を尽くします。

4

1 に答える 1