webrtc源码分析rtc::thread的消息机制

1.定义

创建一个新的线程,并有选择地将其分配给传递的SocketServer。重写Clear的子类应为init_queue传递false,并从其构造函数调用DoInit(),以防止在虚函数表仍在创建时使用该对象与ThreadManager发生冲突。其中这个有选择的分配是指rtc::thread可以与socketserver关联也可以不关联。

rtc::thread关联的socketserver对象的方式有两种,一种是Thread(std::unique_ptr<SocketServer> ss)不进行对象接管。另外一种explicit Thread(SocketServer* ss),这种方式下,thread接管ss,并在thread对象销毁时自动释放ss。

2.关键方法解析

  • static const int kForever = -1;:定义了一个常量kForever,其值为-1,这个值通常用于表示一个操作应该无限期地执行下去。
  • Thread(SocketServer* ss, bool do_init);Thread(std::unique_ptr<SocketServer> ss, bool do_init);:这两个构造函数用于创建一个新的Thread对象,并可以选择性地将其与一个SocketServer对象关联起来。这两个构造函数还接受一个布尔参数do_init,用于控制是否需要立即初始化这个Thread对象。
  • virtual void Quit();:这是一个虚函数,用于停止线程。当这个函数被调用时,线程应该停止接收新的任务,并等待所有已经开始的任务完成。
  • virtual bool IsQuitting();:这是一个虚函数,用于检查线程是否正在停止。如果线程正在停止,这个函数应该返回true,否则返回false
  • virtual void Restart();:这是一个虚函数,用于重新启动线程。当这个函数被调用时,线程应该开始接收新的任务。
  • virtual bool IsProcessingMessagesForTesting();:用于检测是否消息队列是否处理消息
  • void SetDispatchWarningMs(int deadline);:设置预期的处理时间(以毫秒为单位),默认值为50毫秒。当Dispatch()花费的时间超过此时间时,线程将写入日志消息。
  • bool Start();:启动线程
  • void Thread::Stop():停止线程
  • virtual void Run();:执行ProcessMessages(kForever)处理消息
  • void PostTask(absl::AnyInvocable<void() &&> task) override;:向messages_队列里写入任务
  • void PostDelayedTask(absl::AnyInvocable<void() &&> task, webrtc::TimeDelta delay) override; :向delayed_messages_队列里写入任务
  • void PostDelayedHighPrecisionTask(absl::AnyInvocable<void() &&> task, webrtc::TimeDelta delay) override; :向delayed_messages_队列里写入任务
  • bool ProcessMessages(int cms);:处理消息

 

3.解析

①.struct DelayedMessage结构体解析

std::priority_queue<DelayedMessage> delayed_messages_ 延迟任务队列由结构体DelayedMessage组成,是消息队列的主要成员之一。DelayedMessage有4个成员变量,下面是各个成员的详细解释:

(1):int64_t delay_ms; 存储任务应该被延迟的时间

(2):int64_t run_time_ms;存储任务应该被执行的时间

(3):uint32_t message_number;存储消息的序列号

(4):mutable absl::AnyInvocable<void() &&> functor;存储要执行的任务

②任务队列处理过程

(1):任务写入队列

rtc::thread继承TaskQueueBase,需要实现任务队列的一些功能,rtc::thread里提供两个任务队列一个是messages_,一个是delayed_messages_,其中PostTask向队列messages_里写入,PostDelayedTask与PostDelayedHighPrecisionTask向delayed_messages_队列里写入。

rtc::thread通过ProcessMessages方法处理消息时先将delayed_messages_里的到达时间的任务写入到messages_队列中,然后统一从messages_中获取消息,因此从理论上来说postTask任务的优先级会比较高一点。

(2):任务处理过程

rtc::thread通过run方法里的ProcessMessages方法来处理消息队列,ProcessMessages通过get方法获取消息队列中需要处理的消息,然后通过dispatch执行此任务。

 

简图如下:

05be2fe2461e4d669cd2335b55286755.png

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值