我是C#和多线程的新手。如何在C#中使用多线程编写分割和征服算法(如合并排序或快速排序)的程序?如何在C#中使用多线程实现分而治之算法?
2
A
回答
1
您可能想了解一下ThreadPool
。基本上,你要做的是。创建一个是线程安全的,并执行以下步骤的方法:
- 除以输入数据
- 计划使用
ThreadPool
的方法 - 无障碍等待输入数据的每个部分新工作所有产生的线程来完成
- 执行合并步骤
线程池将由.NET进行管理,所以你不必担心产生新的线程和的东西,你会的,但是,NE编辑自己同步的东西。要做到这一点的一个好方法是:
- 创建的
WaitHandle
S(如ManualResetEvent
),您要产卵 - 通行证等待之一,工作数据到生成的处理沿着每个线程一个条目列表螺纹(重要!没有通过一个等待句柄两个线程=>问题)
- 使用
WaitHandle.WaitAll
等待所有等待句柄设置 - 在线程中,在成功或错误
- 设置等待句柄a之后检查单线程的成功或错误ll线程已返回
但是,IIIRC,Windows上有64个等待句柄的限制,但我不太确定。你必须尝试。
3
如果您只是想在线程环境中使用排序例程,那么Thorsten会很好地阐述它。我建议你使用递归算法,因为它已经被分解成可以传递给线程池的方法调用。请记住,线程池有一个限制,如果您用线程填充池,并阻止等待另一个线程变为可用,则可以挂起应用程序。
如果您的目标是对多个内核进行排序并进行高效合并,那么您将从并行排序算法中获得最佳性能。快速排序和合并排序是顺序的,并且由于线程开销,即使使用线程池,也可能在多线程时实际运行速度较慢。还要注意,非递归排序算法比其递归等价算法更快,因为所有这些方法调用都会有额外的堆栈活动。对非常大的数据集进行递归(线程化或非线程化)排序可能会导致堆栈崩溃。
也许你可以问社区示例应用程序的想法来学习线程。我的建议是一个网站爬虫。很多有用的东西,从那个学习!
相关问题
- 1. 中间点而治之算法实现
- 2. 分而治之算法
- 3. 分而治之算法
- 4. 分而治之算法
- 5. 如何使用分而治之算法在y轴上找到最佳线条?
- 6. 学习分而治之算法
- 7. 分而治之算法的并行性
- 8. 如何使用主定理来计算递归,分而治之
- 9. 分而治之法peakFinder
- 10. 如何高效并行化分而治之算法?
- 11. 分而治之:IndexSearch
- 12. 算法:分而治之(应用快速排序?!)
- 13. 分而治之算法(应用二进制搜索?!)
- 14. 分而治之算法中的时间复杂度
- 15. 如何在wpf中实现多线程
- 16. 使用C++实现线程
- 17. 分而治之矩阵乘法
- 18. 使用分而治之发现数列的反转
- 19. 乘以分而治之
- 20. 分而治之和递归
- 21. 分而治之JAVA向量
- 22. 分而治之 - 比较
- 23. Max Sum Subarray - 分而治之
- 24. 更好的替代分而治之算法
- 25. 分而治之的方法来计算根
- 26. 分而治之,动态规划和贪婪算法!
- 27. 查找“分而治之”算法的数组索引?
- 28. 在C中使用多线程实现KeyPress事件
- 29. 如何在C#中实现多线程事务?
- 30. 如何在PlayFramework上实现多线程?
这对我来说是一个新消息,有一个等待处理程序的限制。在此注册表项中可找到特定机器的最大等待处理程序数量:[HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota]。我很好奇,如果这是一个全球机器限制或每个进程tho'。 +1 – Audrius 2009-10-22 08:23:14