非阻塞CORBA C++;服务器:如何避免100%的CPU利用率? 我在C++中开发了一个CORBA服务器。出于各种原因(主要是因为我有其他任务要在主线程中执行),我希望使用非阻塞APIwork\u pending()和perform\u work()
一段微不足道的代码是:非阻塞CORBA C++;服务器:如何避免100%的CPU利用率? 我在C++中开发了一个CORBA服务器。出于各种原因(主要是因为我有其他任务要在主线程中执行),我希望使用非阻塞APIwork\u pending()和perform\u work(),c++,architecture,cpu-usage,corba,C++,Architecture,Cpu Usage,Corba,一段微不足道的代码是: while ( !shutdown ) { if ( orb -> work_pending() ) orb -> perform_work(); if ( <other_requests> ) // my queue of non-corba activities <process_request>; } 使用此解决方案,我可以确保最大响应时间为10ms,空闲时CPU负载较低。 当然,
while ( !shutdown )
{
if ( orb -> work_pending() )
orb -> perform_work();
if ( <other_requests> ) // my queue of non-corba activities
<process_request>;
}
使用此解决方案,我可以确保最大响应时间为10ms,空闲时CPU负载较低。当然,我可以调整10ms的值来平衡这两个参数 我的问题是:
注意:我已经知道我可以使用阻塞的
ORB::run()
+多线程,但我的问题是关于非阻塞的APIORB::perform\u work()
,所以请不要浪费时间问我为什么要使用单线程体系结构,也不要提出替代ORB::perform\u work()
的方案。我只是在试验不同的架构。谢谢。如果使用
CORBA::ORB::work_pending (ACE_Time_Value &tv)
相反
我不确定我是否正确理解了文档。但看起来它最多要等待tv秒,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生了什么,您可以立即做出反应,而不会有任何延迟。当然,如果在其他请求中发生了某些事情,您仍然有10毫秒的延迟…如果使用
CORBA::ORB::work_pending (ACE_Time_Value &tv)
相反
我不确定我是否正确理解了文档。但看起来它最多要等待tv秒,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生了什么,您可以立即做出反应,而不会有任何延迟。当然,如果在其他请求中发生了某些事情,您仍然有10毫秒的延迟…如果使用
CORBA::ORB::work_pending (ACE_Time_Value &tv)
相反
我不确定我是否正确理解了文档。但看起来它最多要等待tv秒,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生了什么,您可以立即做出反应,而不会有任何延迟。当然,如果在其他请求中发生了某些事情,您仍然有10毫秒的延迟…如果使用
CORBA::ORB::work_pending (ACE_Time_Value &tv)
相反
我不确定我是否正确理解了文档。但看起来它最多要等待tv秒,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生了什么,您可以立即做出反应,而不会有任何延迟。当然,如果在其他请求中发生了某些事情,您仍然有10毫秒的延迟…而不是睡眠,如果调用
yield()
,会发生什么情况?如果orb->work\u pending()
在很长一段时间内没有变为false(例如,由于工作复杂),第二种设计有一个潜在的缺陷,其他请求在此期间将不会得到处理。此外,在这种情况下,的sleep\u比sleep\u更易于阅读。@ElliottFrisch不幸的是,在yield()
中,我得到了同样高的CPU负载。看起来您正在采取的方法是使用所谓的轮询循环来轮询服务,以查看是否有工作要做。虽然存在轮询循环的应用程序,但它们往往具有一些不需要的特性,例如100%的CPU利用率,除非使用sleep()
或yield()
或其他措施来允许其他线程和进程访问CPU。另一个建议是,如果使用yield()
,则降低线程优先级。您可能还需要删除进程优先级。你真的应该使用阻塞或信号架构。多线程有什么问题?如果调用yield()
,而不是休眠,会发生什么情况?如果orb->work\u pending()
在很长一段时间内没有变为false(例如,因为工作很复杂),那么第二种设计有一个潜在的缺陷,其他请求在此期间将不会得到处理。此外,在这种情况下,
的sleep\u比sleep\u更易于阅读。@ElliottFrisch不幸的是,在yield()
中,我得到了同样高的CPU负载。看起来您正在采取的方法是使用所谓的轮询循环来轮询服务,以查看是否有工作要做。虽然存在轮询循环的应用程序,但它们往往具有一些不需要的特性,例如100%的CPU利用率,除非使用sleep()
或yield()
或其他措施来允许其他线程和进程访问CPU。另一个建议是,如果使用yield()
,则降低线程优先级。您可能还需要删除进程优先级。你真的应该使用阻塞或信号架构。多线程有什么问题?如果调用yield()
,而不是休眠,会发生什么情况?如果orb->work\u pending()
在很长一段时间内没有变为false(例如,因为工作很复杂),那么第二种设计有一个潜在的缺陷,其他请求在此期间将不会得到处理。此外,在这种情况下,
的sleep\u比sleep\u更易于阅读。@ElliottFrisch不幸的是,在yield()
中,我得到了同样高的CPU负载。看起来您正在采取的方法是使用所谓的轮询循环来轮询服务,以查看是否有工作要做。虽然存在轮询循环的应用程序,但它们往往具有一些不需要的特性,例如100%的CPU利用率,除非使用sleep()
或yield()
或其他措施来允许其他线程和进程访问CPU。另一个sug