我正在创建一种在多个服务器上发送和接收数据的机制.服务器在
Windows上运行,使用Delphi 7.
发送数据是在几个同时的线程中形成的,并且不可能首先知道哪个线程将形成数据.将数据添加到缓冲区的时刻由CriticalSection同步.发送线程不断检查是否有任何新数据要发送.通过这样做,每个线程吃掉1个cpu核心.这种方法非常快,但即使服务器没有发送数据,cpu也大约为100%.我需要多个线程,我需要避免这种高cpu使用率.
我尝试了两种选择:
>睡眠 – 如果缓冲区中没有数据,则运行睡眠(1). cpu内核未加载,但对新数据的响应速度大约低100倍.这不是解决方案.
>杀死和创建线程.如果缓冲区中没有数据,我会杀死该线程.添加数据的函数将创建一个新线程.新线程将发送数据,释放缓冲区并再次被杀死. 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