c# - 在递归函数中创建线程

标签 c# multithreading recursion

我有一个带有一些递归功能的应用程序,通常看起来像这样:

threads = 0;
Algorithm(array) {
    //some code...

    newArray1 = array.Take(array.Length / 2).ToArray();
    newArray2 = array.Skip(array.Length / 2).ToArray();

    ThreadStart start1 = delegate
        {
            Algorithm(newArray1);
        };

    Thread thread1 = new Thread(start1);

    ThreadStart start2 = delegate
        {
            Algorithm(newArray2);
        };

    Thread thread2 = new Thread(start2);
    thread1.Start();
    threads++;
    thread2.Start();
    threads++;
}

递归的深度无关紧要,变量线程始终等于2。为什么?

最佳答案

我假设您不是在等待线程完成。您需要在Algorithm方法内添加对Thread.Join()方法(documentation)的调用,该方法“阻塞调用线程,直到该实例代表的线程终止”(您需要对thread1thread2都执行此操作)。另外,您将需要使用Interlocked类,该类“为多个线程共享的变量提供原子操作”,以增加线程数(请参阅Increment method)。

话虽如此,您应该记住,为单个任务创建新线程效率极低(创建线程/上下文切换会带来性能开销)。相反,您应该使用CLR提供的线程池。如果您想了解有关如何使用任务并行性有效利用线程池的更多信息,请参见this link

关于c# - 在递归函数中创建线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38823379/

相关文章:

javascript - Jquery:如何在准备好的文档上递归分配按钮?

c# - 具有较大最大值的 System.Windows.Forms.TrackBar 内存使用

c# - Entity Framework - 实体类型之间的关联已被切断问题

c# - Pex 和代码契约(Contract)

c++ - 在 VS2012 中使用 C++11 条件变量

java - 使用递归java的数字总和

c# - 更改网格坐标系

c# - Asp.net -- C# 中的多线程

python - 基于 Django 类的 View - 线程问题?

mysql - 如何在 MySQL 中创建递归存储过程?