Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
非阻塞CORBA C++;服务器:如何避免100%的CPU利用率? 我在C++中开发了一个CORBA服务器。出于各种原因(主要是因为我有其他任务要在主线程中执行),我希望使用非阻塞APIwork\u pending()和perform\u work()_C++_Architecture_Cpu Usage_Corba - Fatal编程技术网

非阻塞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的值来平衡这两个参数

我的问题是:

  • 这是一个有效的解决方案吗
  • 在我的例子中,有没有一种“标准”的方法来解决100%的CPU问题

  • 注意:我已经知道我可以使用阻塞的
    ORB::run()
    +多线程,但我的问题是关于非阻塞的API
    ORB::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