2009-10-22 88 views

回答

1

您可能想了解一下ThreadPool。基本上,你要做的是。创建一个是线程安全的,并执行以下步骤的方法:

  1. 除以输入数据
  2. 计划使用ThreadPool的方法
  3. 无障碍等待输入数据的每个部分新工作所有产生的线程来完成
  4. 执行合并步骤

线程池将由.NET进行管理,所以你不必担心产生新的线程和的东西,你会的,但是,NE编辑自己同步的东西。要做到这一点的一个好方法是:

  1. 创建的WaitHandle S(如ManualResetEvent),您要产卵
  2. 通行证等待之一,工作数据到生成的处理沿着每个线程一个条目列表螺纹(重要!没有通过一个等待句柄两个线程=>问题)
  3. 使用WaitHandle.WaitAll等待所有等待句柄设置
  4. 在线程中,在成功或错误
  5. 设置等待句柄a之后检查单线程的成功或错误ll线程已返回

但是,IIIRC,Windows上有64个等待句柄的限制,但我不太确定。你必须尝试。

+0

这对我来说是一个新消息,有一个等待处理程序的限制。在此注册表项中可找到特定机器的最大等待处理程序数量:[HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota]。我很好奇,如果这是一个全球机器限制或每个进程tho'。 +1 – Audrius 2009-10-22 08:23:14

3

如果您只是想在线程环境中使用排序例程,那么Thorsten会很好地阐述它。我建议你使用递归算法,因为它已经被分解成可以传递给线程池的方法调用。请记住,线程池有一个限制,如果您用线程填充池,并阻止等待另一个线程变为可用,则可以挂起应用程序。

如果您的目标是对多个内核进行排序并进行高效合并,那么您将从并行排序算法中获得最佳性能。快速排序和合并排序是顺序的,并且由于线程开销,即使使用线程池,也可能在多线程时实际运行速度较慢。还要注意,非递归排序算法比其递归等价算法更快,因为所有这些方法调用都会有额外的堆栈活动。对非常大的数据集进行递归(线程化或非线程化)排序可能会导致堆栈崩溃。

也许你可以问社区示例应用程序的想法来学习线程。我的建议是一个网站爬虫。很多有用的东西,从那个学习!