【发布时间】:2009-07-14 18:00:05
【问题描述】:
我正在通过两种方法维护他人使用多线程的代码:
1: ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ReadData), objUpdateItem)
2: Dim aThread As New Thread(AddressOf LoadCache)
aThread.Start()
但是,在双核机器上,CPU 利用率只有 50%,而在启用超线程的双核机器上,CPU 利用率只有 25%。
显然线程非常复杂,但这种行为似乎表明我没有理解一些简单的基本事实?
更新
不幸的是,代码太复杂了,无法在此处发布,但出于参考目的,大致是这样的……我有大约 500 个帐户,其数据从数据库加载到内存缓存中……每个帐户单独加载,并且该进程首先调用一个长时间运行的存储过程,然后对返回的数据进行操作和缓存。所以,在这种情况下线程化的重点是确实有一个瓶颈击中数据库(即:线程将空闲长达 30 秒等待查询返回),所以我们线程允许其他人开始处理他们从 Oracle 收到的数据。
所以,主线程执行:
ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf ReadData), objUpdateItem)
然后,ReadData() 继续执行(恰好一次):
Dim aThread As New Thread(AddressOf LoadCache)
aThread.Start()
这发生在递归函数中,因此 QueueUserWorkItem 可以执行多次,然后通过 aThread.Start 执行恰好一个新线程
希望这可以让您对事情的发生方式有一个不错的了解。
那么,在这种情况下,理论上这不应该固定两个内核,而不是在一个内核上达到 100% 的最大值,而另一个内核基本上处于空闲状态?
【问题讨论】:
-
如果不知道 ReadData 和/或 LoadCache 方法在做什么,我们无法真正回答。
-
验证 ReadData 和 LoadCache 使用 CPU 的时间是否足以进行测量。如果任一方法等待某些资源(例如,文件系统中的文件、WaitHandle 或锁),它不会使用任何 CPU,因为线程处于等待模式。
-
我不知道你的程序在做什么,但是如果你不能为你的程序设置一个好的级别,有时最大化你的程序的 cpu 使用是一个非常烦人的行为,因为这会导致程序运行时完全阻塞的机器。有时在等待长时间计算的结果时,有人喜欢至少留下一个核心来浏览或玩纸牌;)
标签: c# .net vb.net multithreading