MaximumConcurrentThrottling我希望这个问题有很多可能的解决方案,我可以自己想出一些解决方案,有些显然比其他的好,但我确定我做不到解决它们是最佳的,所以我很想听听真正的多线程专家的意见。我有大约100个作业可以同时执行,因为它们之间没有依赖关系。如果我依次执行这些操作,我的总执行时间大约是1:30。如果我在线程池中对每个作业进行排队,它需要大约2m,这对我来说意味着我试图一次做太多事情,线程之间的所有这些上下文切换都抵消了拥有这些线程的优势。所以,基于这个假设(如果这是错误的,请随时向我开枪),如果我只排队到我系统中的内核数(在这台机器上是8个),那么我随时可以减少上下文切换,从而提高整体效率(当然其他进程线程负担不起),任何人都可以建议这样做的最佳模式/技术吗?顺便说一下,我正在使用smartthreadpool.codeplex.com,我没有。一个好的线程池已经尝试在每个可用内核中拥有一个活动线程。每个核心有一个工作线程不是问题,就好像一个线程正在阻塞(最常见的I/O)并且您希望另一个线程使用该核心。可能值得尝试使用.NET线程池或Parallel类。如果您的CPU是超线程的(8个虚拟内核超过4个物理内核),这可能是个问题。平均而言,辅助线程使事情变得更快,但在很多情况下事情会变得更糟。尝试为每个其他核心设置亲和力,看看它是否带来改进-如果有,那么这可能是超线程不好的情况。您是否必须再次收集结果,或在不同任务之间共享任何资源?这样做的成本可能比多线程节省的成本要高得多。也许它们是如此不必要-例如,如果您锁定共享数据但数据仅被读取,您实际上不需要读取大多数数据结构(如果不需要,大多数但不是全部对于并发读写都是安全的).工作分工也是一个问题。假设单线程方法在内存区域中运行,但多线程方法为每个线程提供下一个内存来处理循环。这里每个核心有更多的缓存刷新,因为“好的下一位”实际上被另一个核心使用。在这种情况下,将工作分解成更大的块可以解决它。还有许多其他因素可以使多线程方法的性能比单线程方法差,但这些是我马上能想到的。编辑:如果您正在编写一个共享商店,则可能值得尝试一次只丢弃任何结果的运行。这可能会缩小问题所在的范围。你说的话我觉得很奇怪。因为根据定义,线程池不应使用超过系统可用资源的资源(即,如果您有4个内核,它将使用4个线程或接近该数量的线程)。它使用一个队列,工作线程从中获取任务并执行它们。因此,如果您使用线程池,除非您手动指定要使用的线程数,否则您不能真正让系统超额预订,在您的情况下不建议这样做。您是否尝试过使用标准的C#ThreadPool类?以上就是《C#学习教程:最大并发节流共享》的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
