文章目录
WebRtc中的线程设计非常具有参考价值,通过学习它们的实现,可以对线程的理解更上一个台阶。
在WebRtc并不是简单的对os 线程相关的API进行封装,而是结合功能实现需求对线程进行了设计。
在webrtc有两种线程对象:
- rtc::Thread 对象
rtc::Thread是webrtc中最重要的线程类型。它与WebRtc库的实现深度结合。
- rtc::ProcessThread 对象
rtc::ProcessThread线程类型,主要是用作执行一些定时任务。
这篇文章将介绍rtc::Thread及它在WebRtc中的使用。
rtc:Thread
线程模型
rtc::Thread的线程模型如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GZPu3OiZ-1678665809251)(https://note.youdao.com/yws/api/personal/file/WEBff381d87c74c6937c35f05c025579f26?method=download&shareKey=d2fd984d0ab7f17fd5395027c1aa3fab#clientId=ua4f980d8-c6d9-4&id=nodDw&originHeight=1190&originWidth=1574&originalType=binary&ratio=1&rotation=0&showTitle=false&status=done&style=none&taskId=u1c3d1033-3e4f-4638-8ea8-2f6a65535ea&title=)]
如上图所示,rtc::Thread不仅仅是只产生一个线程,它还包含一个队列**(message list)**,将它称为异步任务队列更适合。
它的基本功能就是在线程中执行任务队列中的任务。
它靠事件驱动,也就是说当message list中没有任务(message)时,它会阻塞在事件等待上,当有事件唤醒时后会继续在队列中去任务执行。
主要成员及方法
类图
类图中列出了rtc::Thread的核心类及方法。

Thread类继承自TaskQueueBase,从语意就表明了它是一个任务队列。
核心成员变量:
MessageList messages_
就是任务队列,它是一个std::list,定义如下:
typedef std::list<Message> MessageList,Message类就任务的抽象。
PriorityQueue delayed_message_
延迟任务队列,是一个优先队列。
SocketServer* const ss_
事件驱动器,从名字上就可以看出它可以处理网络IO事件。
核心方法:
它的核心方法就是ProcessMessage和Get方法。
ProcessMessage是线程的执行体,是一个while(true)循环,它不断的从Get中取出任务然后执行,方法框架如下:
bool Thread::ProcessMessages(int cmsLoop) {
while (true) {
Message msg;
//取出任务
Get(&msg, cmsNext);
...
//执行任务
Dispatch(&msg);
}
}
Get方法,首先取出队列中的任务,如果没有任务则处理事件,如果没有事件则阻塞到Wait方法上。
bool Thread::Get(Message* pmsg, int cmsWait, bool process_io) {
//取出队列中的任务
while(true) {
...
if (messages_.empty()) {
break;
} else {
*pmsg = messages_.front();
messages_.pop_front();
}
...
return true;
}
...
//如果没有任务则执行事件,如何也没有事件就阻塞在Wait方法上
{
// Wait and multiplex in the meantime
if (!ss_->Wait(static_cast<int>(cmsNext), process_io))
return false;
}
}
控制类方法
bool Start()
void Stop()
void Run()
这三个是典型的线程控制方法。
任务类方法
异步方法
它是异步队列,有post系列方法,用于将任务投递到线程中执行,这些post方法都是异步方法,马上返回。
- 放入一个
QueuedTask类型的任务。QueuedTask方法内部被封装成了Message类型。
void PostTask(std::unique_ptr<webrtc::QueuedTask> task) override;
- 放入一个
QueuedTask类型的任务,在delay ms后执行。
void PostDelayedTask(std::unique_ptr<webrtc

最低0.47元/天 解锁文章
277

被折叠的 条评论
为什么被折叠?



