非阻塞CORBA C ++服务器:如何避免100%的CPU利用率?

时间:2014-07-29 15:09:22

标签: c++ architecture cpu-usage corba

我正在用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的值来平衡这两个参数。

我的问题是:

  1. 这是一个有效的解决方案吗?
  2. 是否有&#34;标准&#34;在我的情况下解决100%CPU问题的方法?
  3. 注意:我已经知道我可以使用阻止ORB::run() +多线程,但我的问题是关于非阻止API ORB::perform_work(),所以请不要这样做浪费时间问我为什么要使用单线程架构,请不要提出ORB::perform_work()的替代方案。我只是试验不同的架构。感谢。

1 个答案:

答案 0 :(得分:3)

如果您使用

会发生什么
CORBA::ORB::work_pending (ACE_Time_Value &tv)

代替?

我不确定我是否正确理解文档。但看起来这等待最多 tv 秒发生的事情,然后返回。与10毫秒的睡眠相比,优势在于,如果在这10毫秒内ORB中发生某些事情,您可以立即做出反应,没有任何延迟。当然,如果在其他请求中发生了某些事情,你仍然有10毫秒的延迟......