C# では、ParameterizedThreadStart を使用して 100 個のスレッドを生成し、100 要素の int 配列を並べ替えましたが、適切な待機解決で機能しました。今、私は同じことを試してParallel.For(start,end,ParallelOptions,delegate=>{})
いますが、サブグループのみをソートしており、それらの長さはコアの数を超えていません。
float[] sorted;
Random r=new Random();
int[] toBeSorted = new int[100];
//creating random integers between 25 and 75 for an array
for (int i = 0; i < 100; i++)
{
toBeSorted[i] = 25+(int)(r.Next(50));
}
//target array of sorted elements
sorted = new float[101];
//Telling that it can use 100 threads maximum
ParallelOptions po = new ParallelOptions();
po.MaxDegreeOfParallelism = 100;
index = 0; // a static integer
Object myLock = new Object();
//time sorting. The lesser waiting elements are accumulated first.
Parallel.For(0, 100, po, i =>
{
Thread.Sleep(toBeSorted[i] * 100);//same resolution with Thread() version
lock(myLock)
{
sorted[index] = toBeSorted[i];
index++;
}
});
Console.WriteLine();
foreach (float s in sorted)
{
Console.Write("{0} ", s);
}
出力:
29 44 45 48 50 54 56 44 65 59 45 73 32 59 34 46 28 45 71 36 69 36 44 46 46 45 45 40 72 74 70 62 53 30 39 55 30 48 29 32 64 45 66 38 62 66 48 47 46 57 45 33 33 33 62 32 48 58 41 47 55 55 53 28 52 28 63 46 44 44 32 31 29 61 41 55 31 54 48 74 37 37 38 39 51 59 68 65 40 31 37 40 37 71 52 66 45 25 74 57 70 59 74 70 54 72 62 69 69 0
質問 1:生成されるスレッドの最小数を選択するにはどうすればよいですか? または、指定された最大数のスレッドを生成する必要があるというヒントはありますか?
質問 2:要素の上限と下限がわかっている場合、この並べ替えは O(n) よりも悪いことはありますか?
機能しない理由はparallel.for
、ツールであることとdata-parallelism
ツールではないことが原因full-thread-parallelism
でしょうか?
ありがとう。
編集: lock(myLock){} を追加し、この本文にインデックスを配置すると、サブグループが常に 8 の長さになり、ソートが部分的に修復されます。それでも、それらはサブグループです。
編集: ThreadPool.SetMinThreads(100, 100); の使用 および最大バージョンは機能しましたが、他の parallel.for ループのパフォーマンスが低下したため、新しいスレッドを手動で生成する方が良いオプションのようです。