Parallel.Forで実行順序を定義することは可能ですか?

.net-4.0 c# multithreading parallel-for synchronization
Parallel.Forで実行順序を定義することは可能ですか?
// parameters.Count == 10
// actualFreeLicenses == 2
Parallel.For(0, parameters.Count, new ParallelOptions()
                    {
                        MaxDegreeOfParallelism = actualFreeLicenses
                    }, i =>
                    {
                        ExternalProgram(i);
                    }
);

上記のコードを実行すると、「ExternalProgram」メソッドに渡される「i」の値が1と6、後で2と7、後の3と8であることに気づきます…​

14個のパラメーターと2個のライセンスがある場合、常に1と8、後で2と9を起動します…​

順序を定義することは可能ですか?最初の1と2、後の3と4など?

  3  1


ベストアンサー

Queue / ConcurrentQueueを使用して、並列ループの本体でアイテムをデキューしませんか? これにより、順序が保持されます。

9


Parallelを使用している場合、実行される順序は重要ではないため、「Parallel」です。 順序に関連がある場合は、シーケンシャルワークフローを使用する必要があります。

5


代わりにhttp://msdn.microsoft.com/en-us/library/dd997411.aspx [カスタムパーティショナー]で `Parallel.ForEach`を使用したいのですが、実際に実行していないことを忘れないでください”1&6、then 2&7″-(たとえば)スレッド1で1、スレッド2で6、スレッド2で7など プロセスの_pairs_を起動するわけではありません。

プロセスのグループを起動したい場合は、おそらくグループ化を自分で実行し、グループサイズに等しい最大並列度を指定することにより、グループ内で並列処理を提供し、グループ内で並列処理を実行する必要があります。

1


http://msdn.microsoft.com/en-us/library/dd991604.aspx [ForEach]の使用に切り替えることができる場合(おそらく、http://msdn.microsoftを使用して、一連の数値を生成した後.com / en-us / library / system.linq.enumerable.range.aspx [IEnumerable.Range]))、http://msdn.microsoft.com/en-usを取るオーバーロードの1つを使用できます/library/dd381768.aspx [Partitioner]。 3番目のリンクには、一度に1つの要素を提供するサンプルのパーティショナーが含まれています。

0


ランタイムは、使用するスレッドの数を調べ、ワークロードをそれに分割するように見えます。 e.g. 最初のスレッドはデータセットの前半で動作し、2番目のスレッドはデータの後半で動作しています。

0


タイトルとURLをコピーしました