- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一种在多个服务器上发送和接收数据的机制。服务器运行在 Windows 上,使用 Delphi 7。
发送数据是在多个并发线程中形成的,不可能知道哪个线程将首先形成数据。将数据添加到缓冲区的时刻由 CriticalSection 同步。发送线程不断检查是否有新数据要发送。通过这样做,每个线程都会占用 1 个 CPU 核心。这工作得非常快,但即使服务器没有发送数据,CPU 也大约是 100%。我需要多个线程,并且需要避免如此高的 CPU 使用率。
我尝试了两种选择:
sleep - 如果缓冲区中没有数据,我会运行 sleep(1)。 CPU核心没有加载,但对新数据的 react 速度大约低100倍。这不是一个解决方案。
终止和创建线程。如果缓冲区中没有数据,我会终止线程。添加数据的函数将创建一个新线程。新线程将发送数据,释放缓冲区,然后再次被杀死。 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/
我是一名优秀的程序员,十分优秀!