C++ 无限循环vs boost::asio::截止期计时器C++;演出
我开发了一个服务器应用程序,可以处理来自客户端的许多连接。服务器定期(例如:每1秒)向每个客户端发送消息,检查客户端的到期时间(当连接时间达到预定值时,必须强制断开每个客户端与服务器的连接)以及其他一些计时器任务。我考虑了2个解决方案: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秒 我会用第三种方法:
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率。