如何在 Delphi 多线程中避免 100% CPU?
How to avoid 100% CPU in Delphi multithreading?
我正在创建一种在多个服务器上发送和接收数据的机制。服务器在 Windows 上 运行 并且使用了 Delphi 7。
发送数据是在几个并发线程中形成的,无法知道哪个线程先形成数据。将数据添加到缓冲区的时刻由 CriticalSection 同步。发送线程不断检查是否有任何新数据要发送。通过这样做,每个线程吃掉 1 CPU 个核心。这工作得非常快,但是即使服务器没有发送数据,CPU 也大约是 100%。我需要多个线程,我需要避免这种高 CPU 使用率。
我试过两种选择:
Sleep - 如果缓冲区中没有数据我运行 sleep(1)。 CPU核心没有加载,但是对新数据的反应速度大约少了100倍。这不是解决方案。
终止和创建线程。如果缓冲区中没有数据,我会终止线程。添加数据的函数将创建一个新线程。新线程将发送数据,释放缓冲区并再次被杀死。 CPU 负载减少了,但创建和终止需要太多时间。结果速度降低了100倍
是否有任何替代 sleep(1) 的方法不会消耗 100% CPU 并且反应迅速?或者是否可以在某些事件发生之前暂停线程?
问题已回答。这对我有用 .
您可以让线程使用 WaitFor*
函数等待数据。他们不会占用处理器资源。
我建议使用WaitForMultipleOjects
,它有可能等待一些事件。例如,主事件(寻找CreateEvent
或Delphi wrapper class 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
我正在创建一种在多个服务器上发送和接收数据的机制。服务器在 Windows 上 运行 并且使用了 Delphi 7。
发送数据是在几个并发线程中形成的,无法知道哪个线程先形成数据。将数据添加到缓冲区的时刻由 CriticalSection 同步。发送线程不断检查是否有任何新数据要发送。通过这样做,每个线程吃掉 1 CPU 个核心。这工作得非常快,但是即使服务器没有发送数据,CPU 也大约是 100%。我需要多个线程,我需要避免这种高 CPU 使用率。
我试过两种选择:
Sleep - 如果缓冲区中没有数据我运行 sleep(1)。 CPU核心没有加载,但是对新数据的反应速度大约少了100倍。这不是解决方案。
终止和创建线程。如果缓冲区中没有数据,我会终止线程。添加数据的函数将创建一个新线程。新线程将发送数据,释放缓冲区并再次被杀死。 CPU 负载减少了,但创建和终止需要太多时间。结果速度降低了100倍
是否有任何替代 sleep(1) 的方法不会消耗 100% CPU 并且反应迅速?或者是否可以在某些事件发生之前暂停线程?
问题已回答。这对我有用 .
您可以让线程使用 WaitFor*
函数等待数据。他们不会占用处理器资源。
我建议使用WaitForMultipleOjects
,它有可能等待一些事件。例如,主事件(寻找CreateEvent
或Delphi wrapper class 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