线程非常快地获得 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进程cpu100%的问题

高分求c代码:每个线程的cpu使用率

java 多线程 cpu利用率100%问题,我做了一个程序,10个线程,不到一分钟,cpu就100%了,怎么解决。

我的多线程游戏一直处于 100% CPU。如何管理线程活动以减少 CPU 负载?

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

多线程利用多核,cpu利用率却达不到100%?