线程非常快地获得 100% CPU
Posted
技术标签:
【中文标题】线程非常快地获得 100% CPU【英文标题】:thread get 100% CPU very fast 【发布时间】:2011-08-29 07:13:43 【问题描述】:我正在用 C# 实现一个非常基本的线程:
private Thread listenThread;
public void startParser()
this.listenThread = new Thread(new ThreadStart(checkingData));
this.listenThread.IsBackground = true;
this.listenThread.Start();
private void checkingData()
while (true)
然后我立即获得 100% 的 CPU。我想检查是否在 while(true) 循环内读取了传感器数据。为什么会这样?
提前致谢。
【问题讨论】:
我们可以假设while
循环中实际上有一些实现,并且它具有终止的能力吗?
根据此代码获取 100% CPU 是正确的。是否有要检查传感器数据的时间间隔?可能您可能必须相应地休眠线程。
【参考方案1】:
while (true)
会杀死你的 CPU。
你可以添加Thread.Sleep(X)
给你,同时让CPU休息一下再检查。
另外,您似乎确实需要一个计时器。
查看这里的 Timer 类之一http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx。
使用 Timer 以尽可能高的拉动间隔,1 秒,半秒。 您需要在 CPU 使用率和检查之间可以承受的最大延迟之间进行权衡。
【讨论】:
嗨。谢谢。但是我怎么能等待数据到来呢?我想不断检查即将到来的数据。 您需要多久进行一次实际检查?即使让它休眠 10 毫秒也会有很大的不同。 @JoesyXHN - 你的数据来自哪里?【参考方案2】:让你的循环睡眠。它跑来跑去,越来越累。至少,让它最终休息。
【讨论】:
我应该使用:timer.tick per 1 毫秒,而不是使用带有 while 循环的线程并休眠 1 毫秒? 哈哈哈哈哈哈哈哈哈! 1毫秒!尝试 100-500 毫秒。【参考方案3】:因为您的函数在 while 块内没有做任何事情,所以它会占用 CPU,并且出于所有实际目的,永远不会放开它,因此其他线程可以完成它们的工作
private void checkingData()
while (true)
// executes, immediately
如果你把它改成下面这样,你应该会看到更合理的 CPU 消耗:
private void checkingData()
while (true)
// read your sensor data
Thread.Sleep(1000);
【讨论】:
【参考方案4】:您可以使用阻塞队列。从阻塞队列中取出一个项目将阻塞线程,直到有一个项目放入队列。不需要任何 CPU。
使用 .net4,您可以使用 BlockingCollection http://msdn.microsoft.com/en-us/library/dd267312.aspx
版本 4 下,没有阻塞队列 int .net 框架。
如果你google一下,你可以找到很多阻塞队列的实现。
这是一个实现
http://www.codeproject.com/KB/recipes/boundedblockingqueue.aspx
顺便说一句。你等待的数据从哪里来?
编辑
如果你想检查文件。你可以使用 FileSystemWatcher 来检查它的线程块。
如果你的数据来自外部API并且API没有阻塞线程,那么除了使用Thread.Sleep之外没有办法阻塞线程
【讨论】:
如果 JoesyXHN 需要检查文件或外部 API 或其他内容,阻止收集将如何提供帮助? 你是对的。如果他想观看文件或数据来自外部 API。阻塞收集是没用的。 所以我问他数据是从哪里来的。【参考方案5】:如果您正在轮询某个条件,请务必按照其他人的建议进行操作并进入睡眠状态。我还要补充一点,如果您需要最高性能,您可以使用统计技巧来避免在读取传感器数据时休眠。当您检测到传感器数据空闲时,例如连续 10 次,然后在每次迭代时再次开始休眠。
【讨论】:
以上是关于线程非常快地获得 100% CPU的主要内容,如果未能解决你的问题,请参考以下文章
java 多线程 cpu利用率100%问题,我做了一个程序,10个线程,不到一分钟,cpu就100%了,怎么解决。