当前位置:  开发笔记 > 编程语言 > 正文

为什么C#中的多线程不能达到100%的CPU?

如何解决《为什么C#中的多线程不能达到100%的CPU?》经验,为你挑选了3个好方法。

我正在开发一个处理许多请求的程序,它们都没有超过50%的CPU(目前我正在研究双核).所以我为每个请求创建了一个线程,整个过程更快.处理9个请求,单个线程持续02min08s,同时3个线程同时工作,时间减少到01min37s,但它不使用100%CPU,只有大约50%.

我怎么能让我的程序使用完整的处理器功能?

编辑 应用程序不是IO或内存有限,它们始终处于合理的水平.

我认为它与'双核'事物有关.

有一个锁定的方法调用,每个请求使用,但它真的很快,我不认为这是问题.

我的代码中代价更高的部分是通过COM调用dll(从所有线程调用相同的外部方法).这个dll也没有内存或IO限制,它是一个AI识别组件,我正在进行OCR识别薪水,支票请求.

EDIT2

STA COM方法很可能是我的问题,我联系了组件所有者以解决这个问题.



1> Jon Skeet..:

您的申请中是否有重大锁定?如果线程相互等待很多,那很容易解释它.

除此之外(以及给出的其他答案),真的很难猜到.探查器是你的朋友......

编辑:好的,鉴于下面的评论,我想我们正在做点什么:

我的代码中代价更高的部分是通过COM调用dll(从所有线程调用相同的外部方法).

COM方法是否在STA中运行?如果是这样,它将只使用一个线程,序列化调用.我强烈怀疑这是关键.它类似于锁定该方法调用(不可否认,不完全相同).



2> Edward KMETT..:

问题是COM对象.

大多数COM对象在"单线程单元"的上下文中运行.(您可能不时在.NET应用程序的main方法上看到[STAThread]注释?)

实际上,这意味着对该对象的所有调度都由单个线程处理.在问题上投入更多内核只会为您提供更多资源,可以在.NET中等待或执行其他操作.

您可能想看看Joe Duffy(微软的并行.NET主管)关于该主题的这篇文章.

http://www.bluebytesoftware.com/blog/PermaLink,guid,8c2fed10-75b2-416b-aabc-c18ce8fe2ed4.aspx

实际上,如果你必须针对像这样的单个COM对象做一些事情,那么你就会受到冲击,因为.NET只会在你的背后内部序列化访问模式.如果您可以创建多个COM对象并使用它们,则可以解决该问题,因为可以从不同的STA线程创建和访问每个对象.这将一直有效,直到你达到大约100个STA线程,然后事情会变得很糟糕.有关详细信息,请参阅文章.



3> Rob Prouse..:

处理器可能不再是完成流程的瓶颈.瓶颈可能转移到磁盘访问,网络访问或内存访问.您还可能遇到线程争用锁定的情况.

只有你确切地知道你的线程在做什么,所以你需要考虑到上面的内容.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有