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执行此任务。
简图如下: