0
点赞
收藏
分享

微信扫一扫

WebRTC C++ 线程和线程管理剖析

线程管理

实例化代码(单例)

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中又把控制权交给了发送线程.发送线程把要执行的逻辑交给执行线程.

举报

相关推荐

0 条评论