multithreading - Delphi多线程中如何避免CPU 100%?

标签 multithreading delphi asynchronous cpu-usage thread-sleep

我正在创建一种在多个服务器上发送和接收数据的机制。服务器运行在 Windows 上,使用 Delphi 7。

发送数据是在多个并发线程中形成的,不可能知道哪个线程将首先形成数据。将数据添加到缓冲区的时刻由 CriticalSection 同步。发送线程不断检查是否有新数据要发送。通过这样做,每个线程都会占用 1 个 CPU 核心。这工作得非常快,但即使服务器没有发送数据,CPU 也大约是 100%。我需要多个线程,并且需要避免如此高的 CPU 使用率。

我尝试了两种选择:

  1. sleep - 如果缓冲区中没有数据,我会运行 sleep(1)。 CPU核心没有加载,但对新数据的 react 速度大约低100倍。这不是一个解决方案。

  2. 终止和创建线程。如果缓冲区中没有数据,我会终止线程。添加数据的函数将创建一个新线程。新线程将发送数据,释放缓冲区,然后再次被杀死。 CPU负载减少了,但是创建和删除时间太长。结果速度降低了 100 倍。

是否有任何替代 sleep(1) 的方法,不会消耗 100% CPU 并且 react 迅速?或者是否可以在某些事件发生之前暂停线程?

问题已得到解答。这对我有用 https://stackoverflow.com/a/4401519/4052208 .

最佳答案

您可以使用 WaitFor* 函数让线程等待数据。他们不会消耗处理器资源。

我建议使用WaitForMultipleOjects,它可以等待某些事件。例如,当数据在缓冲区中时,主事件(查找CreateEvent或Delphi包装类TEvent)应该由数据生产者设置,另一个事件用于线程终止:

//Execute body
repeat
  WaitRes := WaitForMultipleObjects(2, @FEventHandles, False, CONST_TIMEOUT); // or INFINITE
  if WaitRes = WAIT_OBJECT_0 + 1 then // event from data producer
    GetDataFromBuffer();

until WaitRes = WAIT_OBJECT_0; // external event for thread stop

关于multithreading - Delphi多线程中如何避免CPU 100%?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37047685/

相关文章:

java - 测量锁的争用时间

python - 使用线程/多进程读取多个文件

c# - 为什么 Microsoft Visual C# 2008 Express Edition 调试器随机退出?

Delphi - RoundTo - 总是向下

delphi - Delphi中如何检查字符串是否是有效的日期时间格式字符串

jquery - 如何使用 jQuery 管理链式 AJAX 调用

c++ - Windows 上互斥量、临界区等的成本

delphi - 未登录时通过扬声器输出声音

c++ - 带有异步操作的 std::function 回调

C# 异步套接字同时读写?