我正在用C ++开发CORBA服务器。由于各种原因(主要是因为我还有其他任务要在主线程中执行),我想使用非bloking API work_pending()
和perform_work()
。
一段琐碎的代码片段是:
while ( !shutdown )
{
if ( orb -> work_pending() )
orb -> perform_work();
if ( <other_requests> ) // my queue of non-corba activities
<process_request>;
}
但是,此代码使用100%的CPU。
我认为100%的CPU利用率是不可接受的,即使在[多核]服务器中也是如此(请您确认一下吗?),因此我对此问题的解决方案是使用sleep_until
来改善while周期:
while ( !shutdown )
{
system_clock::time_point now = system_clock::now();
while ( orb -> work_pending() )
orb -> perform_work();
while ( <other_requests> )
<process_request>;
std::this_thread::sleep_until( now + milliseconds( 10 ) );
}
通过这个解决方案,我可以确保最大响应时间为10毫秒,空闲时CPU负载较低 当然,我可以调整10ms的值来平衡这两个参数。
我的问题是:
注意:我已经知道我可以使用阻止ORB::run()
+多线程,但我的问题是关于非阻止API ORB::perform_work()
,所以请不要这样做浪费时间问我为什么要使用单线程架构,请不要提出ORB::perform_work()
的替代方案。我只是试验不同的架构。感谢。
答案 0 :(得分:3)
如果您使用
会发生什么CORBA::ORB::work_pending (ACE_Time_Value &tv)
代替?
我不确定我是否正确理解文档。但看起来这等待最多 tv 秒发生的事情,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生某些事情,您可以立即做出反应,没有任何延迟。当然,如果在其他请求中发生了某些事情,你仍然有10毫秒的延迟......