Parallel.For如何获取正在循环使用的线程数?

时间:2019-03-26 16:04:36

标签: c# multithreading parallel-processing task-parallel-library

我对Parallel.For方法有疑问。

我想比较一下在图像处理算法中使用1到4个线程。我是这样设置Parallel.For的:

        ParallelOptions po = new ParallelOptions();
        po.MaxDegreeOfParallelism = 4;

        Parallel.For(0, height - 1, po, y =>
        {
            int offset = y * stride; //row
            for (int x = 0; x < width - 1; x++)
            {
                //do stuff here
            }
         });

时间按Stopwatch类进行计数。

var stopwatch = Stopwatch.StartNew();
MethodWithParallelFor.Execute();
stopwatch.Stop();

我的问题是,为什么当我将MaxDegreeOfParallelism设置为任何值(我的CPU有8个线程)时,我得到的时间完全相同?当我将Degree设置为1或4时,我得到相同的执行时间。

那么,如何调试Parallel.For以获得信息,循环中有多少个线程正在运行?如何强制程序使用我想要的那么多线程?如果需要,我可以分享我的完整代码

我在c#7.3和WPF 4.6.2中实现了我的测试程序

2 个答案:

答案 0 :(得分:1)

如果您只想知道并行运行了多少个线程,对于任何给定时间,您都可以使用Interlocked.Increment和Interlocked.Decrement(在循环的开始和结束处),请检查如果变量中的值大于之前的值,并在Parallel.For完成后将其输出,则如下所示:

public void TestParallelism() {
    int maxThreads = 0;
    int currentThreads = 0;

    Parallel.For(0, 100, (i) => {

        var max = Interlocked.Increment(ref currentThreads);

        if (maxThreads < max) {
            maxThreads = max; 
        }

        // your code here...

        Interlocked.Decrement(ref currentThreads);
    });

    Console.WriteLine($ "Max Parallel Threads: {maxThreads}");
}

答案 1 :(得分:0)

您可以尝试将minimum threads设置为更高的数字。对于我的机器,默认值为4。

ThreadPool.SetMinThreads(8, 8);

您还可以在循环中嵌入Console.WriteLine(y + " -> " + Thread.CurrentThread.ManagedThreadId),以观察哪个线程正在执行每个循环。