在 C# 中,我使用 ParameterizedThreadStart 生成 100 个线程来对 100 个元素的整数数组进行排序,并且它以适当的等待分辨率工作。现在我尝试使用相同的东西,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 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 62 32 48 58 41 47 55 53 28 52 28 63 46 44 32 31 29 61 41 55 31 54 48 74 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 69 0
问题 1:如何选择生成的最小线程数,或者是否有提示它应该生成指定的最大线程数?
问题2:如果元素的上下界已知,这种排序会比O(n)更差吗?
不工作的原因可能parallel.for
是作为data-parallelism
工具而不是full-thread-parallelism
工具?
谢谢。
编辑:添加 lock(myLock){} 并将索引放入此正文中,使子组始终为 8 长度,这部分修复了排序。他们仍然是子群体。
编辑:使用 ThreadPool.SetMinThreads(100, 100); 并且最大版本有效,但其他 parallel.for 循环的性能下降,因此手动生成新线程似乎是更好的选择。