0

在 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 循环的性能下降,因此手动生成新线程似乎是更好的选择。

4

1 回答 1

1

Parallel.For使用底层ThreadPool来执行它的工作,这就是为什么你没有看到它产生 100 个线程的原因。MaxDegreeOfParallelism仅允许您将并发任务的数量限制为低于运行时“考虑”的任务数量,但不会规定实际并行执行的任务数量。

index由于执行任务之间的睡眠间隙很大,静态增量只能在没有锁的情况下偶然工作。

于 2013-07-29T13:45:03.750 回答