[英]Basic multi-threading questions in C#
我是多线程的新手,我正在努力在我的应用程序中并行化一个区域。 我在这个网站上看了很多帖子,但我仍然对解决问题的最佳方法感到困惑:
[1]在.NET 3.5中, ThreadPool
是程序利用机器中多核的唯一方法吗? 即是否可以使用new Thread()
在不同的核心上生成线程?
[2]我的情况:我有List<Calculation>
包含大约80个项目,目前按顺序处理。 因此,鉴于我使用的是.NET 3.5并且基于我所阅读的内容,由于线程数量很多, ThreadPool
可能是多线程的最佳选择:
这就是工作项的依赖性看起来如何(细节不重要,只是想要指出依赖项的复杂性):
我如何根据它优先处理具有10多个其他工作项的主Calculations
? 使用信令的最有效方式是什么?
谢谢。
编辑:我应该提到List<Calculation>
仍然是固定的。 但是,计算80+计算称为x百万次。 每次更新迭代器时,都会在列表中的每个Calculation
上调用Calculate()。
[1]:是的,可以使用new Thread()
在不同的核心上生成线程,尽管使用new Thread()
池可能会更好。 这里讨论的区别如下:
使用任务并行库在.Net 4.0中这将是非常容易的。
你什么时候安排升级? 它可能比您自己编写所有必需的协调代码更快。
如果您必须执行此强制操作,则可以使用Thread.BeginThreadAffinity来确保在单个CPU上运行封闭的代码。 这应该有助于您的计算性能。
[1]在.NET 3.5中,ThreadPool是程序利用机器中多核的唯一方法吗? 即是否可以使用新的Thread()在不同的核心上生成线程?
由操作系统决定一个线程应该运行在哪个核心上。 默认情况下,操作系统会在多个核心上均匀分配线程(至少在Windows中)。
ThreadPool
使用与Thread
类相同的线程,因为实际上只有一种(但不同类型的类和算法包装它们)
[2]我的情况:我有Listthat包含大约80个项目,目前按顺序处理。 因此,鉴于我使用的是.NET 3.5并且基于我所阅读的内容,由于线程数量很多,ThreadPool可能是多线程的最佳选择:
使用ThreadPool.QueueWorkItem
似乎是转换应用程序的最简单方法。
请记住,运行100个不同的线程并不是说您的应用程序比运行10个线程快10倍。 如果在.net和操作系统在线程之间切换时发生后台事件,那么10个线程更有可能运行得更快。
List
转换为Queue
正如评论中所提到的, PLINQ使这很容易。
List<Calculation> foo = ...;
foo.AsParallel.Select(c => c.Calculate());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.