线程管理
实例化代码(单例)
ThreadManager* ThreadManager::Instance() {
static ThreadManager* const thread_manager = new ThreadManager();
return thread_manager;
}
初始化位置
WebRTC中启动新线程的标准方法是通过创建Thread对象,然后调用Thread.Start()方法来启用新的线程,而该方法的内部会直接调用一次Insance()
bool Thread::Start() {
RTC_DCHECK(!IsRunning());
if (IsRunning())
return false;
Restart(); // reset IsQuitting() if the thread is being restarted
// Make sure that ThreadManager is created on the main thread before
// we start a new thread.
ThreadManager::Instance();
}
WebRTC启动新线程的非标准方法,即用户继承了Thread对象,并且不能通过Thread.Start()方法来启用新线程。此时,WebRTC中是如何保证这点的?如下截图,Thread的WrapCurrent()方法的说明以及其实现说明了此种情况:
继承Thread的类,如果不能通过Thread.Start()来启动线程时,应该在构造中调用WrapCurrent()方法,该方法如下图所示,首先就会调用ThreadManager::Instance()来获取ThreadManager的单例对象
bool Thread::WrapCurrent() {
return WrapCurrentWithThreadManager(ThreadManager::Instance(), true);
}
线程
webrtc的所有其他线程都是由三大线程所创建的, 而这三大线程是在创建peer connectionfactory的时候所创建的,线程参数如果传空, 就会在内部逻辑自行创建这三个线程, 并通过Start()函数启动线程
三大线程有
- 信号线程: 负责与应用层交互, 上层调用API, 并在API内部进行了应用线程到信号线程的切换,当进行底层逻辑处理的时候就会从信号线程切换到工作线程, 默认把主线程当作信号线程.
- 工作线程: 负责内部逻辑处理, 是最为核心的线程,所有底层的核心逻辑都是由此线程完成.
- 网络线程: 负责网络数据包的收发.
三个线程的协作关系, 例如:
网络线程收到数据包之后, 首先把数据包交给工作线程, 由工作线程做一些逻辑处理(把rtp包头去掉, 保留payload数据, 将多个rtp包组成一个视频帧), 如果应用层想要获取底层的反馈信息, 工作线程就会将相应的数据交个信号线程, 由信号线程传个应用层.
线程的运行
执行函数的基本运行逻辑 内部为一个while死循环 -- 从队列中取出消息 然后交给Dispatch处理消息, 在dispatch中又把控制权交给了发送线程.发送线程把要执行的逻辑交给执行线程.
标签:信号线,thread,Thread,C++,Start,线程,ThreadManager,WebRTC From: https://blog.51cto.com/fengyuzaitu/7598605