C++ 无限循环vs boost::asio::截止期计时器C++;演出

C++ 无限循环vs boost::asio::截止期计时器C++;演出,c++,timer,boost-asio,timertask,C++,Timer,Boost Asio,Timertask,我开发了一个服务器应用程序,可以处理来自客户端的许多连接。服务器定期(例如:每1秒)向每个客户端发送消息,检查客户端的到期时间(当连接时间达到预定值时,必须强制断开每个客户端与服务器的连接)以及其他一些计时器任务。我考虑了2个解决方案: 使用while(true){foreach clients{check time} 对于每个客户机,delcare都有一个截止时间计时器,并为每个任务调用async\u wait,因此它将生成许多截止时间计时器实例 哪种解决方案对性能更有利?一般来说,我应该使用

我开发了一个服务器应用程序,可以处理来自客户端的许多连接。服务器定期(例如:每1秒)向每个客户端发送消息,检查客户端的到期时间(当连接时间达到预定值时,必须强制断开每个客户端与服务器的连接)以及其他一些计时器任务。我考虑了2个解决方案:

  • 使用while(true){foreach clients{check time}
  • 对于每个客户机,delcare都有一个截止时间计时器,并为每个任务调用async\u wait,因此它将生成许多截止时间计时器实例

  • 哪种解决方案对性能更有利?一般来说,我应该使用无限循环还是声明许多计时器实例?还有一点,您能解释一下操作系统是如何管理截止时间计时器的吗?

    您是否要求每个客户端的超时时间精确(或几乎)为1秒

    我会用第三种方法:

    while (true) {
      if ( elapsed_one_second() ) {
        for each client {
          client->check_timeout();
        }
    }
    
    或者,如果您有事件队列,则执行一个计时器来触发对所有客户端的检查

    编辑: 如果你有大量的定时器,你也可以考虑使用Delta队列并使用最早事件的单次定时器。 Q.哪种解决方案对性能更有利

    无限循环通常是不好的。在CPU饱和的工作线程关联中会发现异常(但这在这里似乎不适用)

    Q.一般来说,我应该使用无限循环吗

    没有

    Q.或声明多个计时器实例

    或者只是

    std::vector<boost::shared_ptr<asio::deadline_timer> > m_timers;
    
    std::向量m_定时器;
    
    或类似:)

    Q.还有一个问题,你能解释一下操作系统是如何管理死机计时器的吗

    计时器在幕后使用特定于平台的内核事件。这意味着,在实践中,如果在不同的计时器上阻塞了10个任务,内核将使进程保持睡眠状态(根本不运行),直到第一个任务过期


    到目前为止,内核级同步原语通常是非CPU限制的工作负载的最快方式。

    我希望时间非常准确,因此此解决方案不适用于这种情况,您可以使用增量队列并使用一个计时器,您可以完全控制复杂性。我不知道增量队列,如果我的服务器处理数千个并发客户机(每个客户机需要一些deadline\u timer实例),那么它需要创建大量deadline\u timer实例。截止时间计时器实例的数量是否有限制?这将由实现定义。如果它是关于“巨大的”(见Calvin回答),确实考虑一个“标记和扫描”的方法,交易资源使用的准确性和可能的平均(IO)IO率。