gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:58:39 25 4
gpt4 key购买 nike

我正在创建一种在多个服务器上发送和接收数据的机制。服务器运行在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com