具有无限循环和 thread.sleep 高 CPU 使用率的多个线程

Posted

技术标签:

【中文标题】具有无限循环和 thread.sleep 高 CPU 使用率的多个线程【英文标题】:Multiple threads with infinite loop and thread.sleep high CPU usage 【发布时间】:2020-09-16 20:27:30 【问题描述】:

在我的控制台应用程序中,我有一些线程,每个线程都有一个带有 Thread.Sleep 的无限循环。 有很多线程,因为每个线程都独立于其他线程。 每个循环每waitingTime 时间运行一次,我希望它永远不会停止。

static int waitingTime= 5 * 60 * 1000;

static void Main(string[] args)

    Thread thread1 = new Thread(() => Thread1());
    Thread thread2 = new Thread(() => Thread2());
    Thread thread3 = new Thread(() => Thread3());
    ...
    thread1.Start();
    thread2.Start();
    thread3.Start();
    ...


static void Thread1()

      do
      
          // Connect to DB and do something...
          try
          
              using (SqlConnection connection = MyDBClass.MyDBConnection())
              
                  connection.Open();
                  SqlCommand command = connection.CreateCommand();
                  command.CommandText = "SELECT x, y FROM Table WITH (NOLOCK);";
                  SqlDataReader sdr = command.ExecuteReader();
                  while (sdr.Read())
                  
                      MyObject obj = new MyObject(sdr[0] as string, ...);
                      MyStaticClass.SetMyObject(obj); // Open a new DB connection on different server and do an Update.
                  
                  sdr.Close();
                  sdr.Dispose();
              
          
          catch
          
          

          Thread.Sleep(waitingTime);
      
      while (true);
 

static void Thread2()

     do
     
        // Connect to DB and do something...
        Thread.Sleep(waitingTime);
     
     while (true);
 

...

我已经读到在这种情况下使用 Thread.Sleep() 并不好,并且应该使用像 EventWaitHandle 这样的解决方案。 这种情况的最佳解决方案是什么以及如何实施。

【问题讨论】:

您的用例不清楚。为什么你需要Thread.Sleep?为什么你认为EventWaitHandle 会帮助你?请详细说明。 您是否使用多线程来提高性能?数据库访问最好通过异步而不是并行来解决。 使用计时器并研究异步编程。创建线程然后让它们休眠是浪费资源...... @dymanoid Thread.Sleep 是让循环停止等待时间。使用EventWaitHandleAutoResetEvent可以释放CPU使用率吗? @JohnathanBarclay 我使用多个线程来允许 Thread1()、Thread2() ... 代码独立于其他人运行。你能告诉我最好的方法是什么吗? 【参考方案1】:

使用Thread.Sleep() 休眠的线程消耗的CPU 资源为零,因此尝试使用EventWaitHandle 原语或其他方式对此进行改进是没有意义的。你不能打败零。您可以改进的是线程消耗的 RAM,它们的堆栈为 1 MB,加上它们在堆上分配的内存(这取决于它们在工作时所做的事情)。因此,通过使用单个线程而不是三个线程,您可以将 RAM 消耗减少 2 MB 或更多,这对于在现代 PC 上运行的控制台应用程序来说几乎没有什么意义。所以我不会在你的位置上担心它。

【讨论】:

嗨。有一段时间我的所有线程都处于睡眠状态,而我的 CPU 使用率约为 10%。你觉得有什么理由吗? @Sponsor 他们唯一能想到的就是垃圾收集器在其专用线程中完成其工作。不过,对于 CPU 使用率延长 10% 似乎不是一个很好的解释。

以上是关于具有无限循环和 thread.sleep 高 CPU 使用率的多个线程的主要内容,如果未能解决你的问题,请参考以下文章

启动和停止无限循环

Thread.sleep() 不工作。被跳过的操作

添加一个没有 Thread.sleep 的延迟和一个啥都不做的 while 循环

如何处理:循环调用'Thread.sleep()',可能是忙等待

std::this_thread::sleep_until 时间完全偏离了大约 2 倍,莫名其妙

当我进行异步调用时,是不是有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)?