如何避免Delphi多线程中的100%CPU?
我正在创建一种在多个服务器上发送和接收数据的机制.服务器在
Windows上运行,使用Delphi 7.
发送数据是在几个同时的线程中形成的,并且不可能首先知道哪个线程将形成数据.将数据添加到缓冲区的时刻由CriticalSection同步.发送线程不断检查是否有任何新数据要发送.通过这样做,每个线程吃掉1个CPU核心.这种方法非常快,但即使服务器没有发送数据,CPU也大约为100%.我需要多个线程,我需要避免这种高CPU使用率. 我尝试了两种选择: >睡眠 – 如果缓冲区中没有数据,则运行睡眠(1). CPU内核未加载,但对新数据的响应速度大约低100倍.这不是解决方案. 有没有替代睡眠(1)不消耗100%CPU并迅速做出反应?或者是否可以在某些事件发生之前暂停线程? 问题得到了回答.这适用于我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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |