具有无限循环和 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
是让循环停止等待时间。使用EventWaitHandle
或AutoResetEvent
可以释放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 的延迟和一个啥都不做的 while 循环
如何处理:循环调用'Thread.sleep()',可能是忙等待
std::this_thread::sleep_until 时间完全偏离了大约 2 倍,莫名其妙
当我进行异步调用时,是不是有必要在 iOS 和 Android 的 while 循环中使用 Thread.Sleep(1)?