boost::asio::deadline_timer异步handler频繁进入的问题

博客讨论了在使用Boost库构建流媒体服务器时遇到的问题,前端摄像机掉线后,多个播放器重连可能导致boost::asio::deadline_timer失效,触发handler频繁执行,日志快速增长。问题源于定时器处理函数忽视了错误码检查,每次调用都会重新设置定时器。解决方案是将定时器的重新设置放入错误判断内部,确保只有在无错误时才会启动新的计时。修复此问题可以避免日志风暴,优化服务器性能。

使用了boost库完成了流媒体服务器,在使用过程中反馈如下问题:

前端摄像机掉线,流媒体服务器执行摄像机掉线处理后,等待播放器重连;如果多个播放器同时执行重连时,会不定时出现boost::asio::deadline_timer失效,导致handler会频繁的进入,然后日志文件快速增长,占用大量的磁盘空间,查看日志文件可看到每秒400条以上的handler执行记录。

通过不断测试发现,多个播放器重连时,会偶然导致以下代码段执行多次

 

m_timer.expires_from_now(boost::posix_time::seconds(10));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCPCmd, this,boost::asio::placeholders::error));

m_timer在未超时时,如果再次执行,会导致m_timer失效,handler会频繁的进入。

经过查找代码发现,定时器处理函数里面忽略了错误码的判断,不管正常与否,都再次重新设置了定时器,以定时发送RTCP数据包。

错误代码如下:

void SendRTCP(const boost::system::error_code& ec)
{
	
	if (!ec)
	{
		
        ...
        SendRequest(tmp);
        ...
		
	}

	
    m_timer.expires_from_now(boost::posix_time::seconds(40));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCP,this,boost::asio::placeholders::error));
	
}

修改后,将定时重新设置代码放入到判断错误的代码段里面

void SendRTCP(const boost::system::error_code& ec)
{
	
	if (!ec)
	{
		
        ...
        SendRequest(tmp);
        ...
		
  m_timer.expires_from_now(boost::posix_time::seconds(40));
		m_timer.async_wait(boost::bind(&CRTSPClient::SendRTCP,this,boost::asio::placeholders::error));
	}

	
  
	
}

一定要注意错误的处理

一定要注意错误的处理

一定要注意错误的处理

<think>我们正在讨论的是Boost.Asio库中的deadline_timer类型。根据提供的引用内容,我们可以明确回答用户的问题。 引用[1]和[引用[2]都直接提到了boost::asio::deadline_timer,并说明它是Boost.Asio中提供的一种基于时间点的定时器。 引用[3]进一步说明:deadline_timer实际上是basic_deadline_timer的一个typedef,其定义为: typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer; 因此,deadline_timer确实是Boost.Asio库中的一个类型(类)。 另外,引用[4]也多次提到boost::asio::deadline_timer,并分析了其运行机制。 所以,我们可以肯定地回答用户:deadline_timerBoost.Asio库中的一个类(类型)。 由于用户的问题很简单,我们只需直接给出答案,并简要引用相关段落作为依据。 注意:用户要求确认deadline_timer是否属于boost::asio库中的类型,我们回答“是”。 同时,按照要求,我们需要在回答末尾生成相关问题。</think>是的,`deadline_timer` 是 Boost.Asio 库中的核心类型。根据提供的引用内容,可以明确以下几点: ### 关键确认点 1. **正式定义** `boost::asio::deadline_timer` 是 Boost.Asio 提供的标准定时器类型,用于同步/异步时间操作[^1][^2]。 2. **类型本质** 它实际上是模板类 `basic_deadline_timer` 的别名: ```cpp typedef basic_deadline_timer<boost::posix_time::ptime> deadline_timer; ``` 这表明它是 Boost.Asio 类型系统的正式组成部分[^3]。 3. **使用依赖** 其构造必须依赖 `io_service` 对象: ```cpp boost::asio::io_service io; boost::asio::deadline_timer timer(io, boost::posix_time::seconds(5)); ``` 这进一步证实其属于 Boost.Asio 的核心设施[^2][^4]。 4. **功能实现** 通过 `deadline_timer_service` 与 I/O 服务(如 Windows 的 `win_iocp_io_service`)深度集成,实现定时队列管理和异步回调[^4]。 ### 核心功能总结 | 功能 | 描述 | |---------------|----------------------------------------------------------------------| | **同步等待** | 阻塞线程直到指定时间点(如 `timer.wait()`)[^1] | | **异步等待** | 注册回调函数,到期自动触发(如 `timer.async_wait(handler)`)[^1] | | **时间精度** | 基于 `boost::posix_time::ptime` 提供微秒级精度[^3] | | **跨平台** | 通过 `io_service` 抽象层适配不同系统的异步机制(如 IOCP)[^4] | > 示例:异步定时器使用 > ```cpp > void handler(const boost::system::error_code& ec) { > std::cout << "Timer expired!" << std::endl; > } > > boost::asio::io_service io; > boost::asio::deadline_timer timer(io, boost::posix_time::seconds(3)); > timer.async_wait(&handler); // 注册异步回调 > io.run(); // 启动事件循环 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值