5

次のコードが順次実行されるのはなぜですか?

List<Task> tasks = new List<Task>();

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

Task.WaitAll(tasks.ToArray());

を使用して、これのバージョンもテストしましたParallel.Invoke。これも並列実行に失敗します。私が理解していないことがあるはずですが、これをグーグルで検索すると、ほとんどの場合、順次実行を強制する方法についての指示が得られます。

以下の回答に記載されている警告の 1 つに対する回答として、参照用に次の方法を含めました。

static void Count(ref int counter, int num)
{
    int localCounter = 0;
    for (int i = 0; i < num; i++)
        if (Coin()) localCounter++;
    System.Threading.Interlocked.Add(ref counter, localCounter);
}

再編集:ありがとうございました!

4

3 に答える 3

4

コードを置き換えtasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));Console.WriteLineデバッグするだけです。

複数のタスクを作成することはありません。

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        Console.WriteLine(i);
    else
        block = max - i;

}
于 2013-01-04T22:11:46.037 に答える
1

次のコードが順番に実行されるのはなぜですか?

Count単一のリソースへのアクセスを同期しているメソッド内に何かがない限り、そうではありません。並列化できる場合、これは並列に実行されます。

実行が非常に速い場合Count、新しいタスクがスケジュールされるよりも早くタスクが終了することがわかります。これが、すべてのタスクが順番に実行される可能性がある理由です。

于 2013-01-04T22:05:21.380 に答える
1

loop/if ステートメントに何か問題があるようです:

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

私がそれを正しく読んでいる場合、タスクを追加するのは ifi + block >= maxのみで、ループするのは if のみですi + block <= max(カウンターの増加と状態チェックの両方を表示します)。そのため、タスクを追加するのは 1 回だけです。

さらに、タスクを追加していないときにブロックを変更しています。次のようなものが必要になると思いますが、コードがないとわかりません。

for (int i = 0; i <= max; i += block)
{
    tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    if (i + block >= max) { block = max - i; }
}
于 2013-01-04T22:11:53.013 に答える