首页 > 编程语言 >WebRTC C++ 线程和线程管理剖析

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

时间:2023-09-25 19:32:46浏览次数:36  
标签:信号线 thread Thread C++ Start 线程 ThreadManager WebRTC

线程管理

实例化代码(单例)

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

相关文章

  • 线程有哪些常用的调度方法?
    一、线程等待在Object类中有一些函数可以用于线程的等待:1.1wait()当一个线程A调用一个共享变量wait()方法时,线程A会被阻塞挂起,发生以下情况才会返回:(1)线程A调用了共享对象的notify()或者notifyAll()方法。(2)其它线程调用了线程A的interrupt()方法,线程A抛出InterruptedException异常......
  • C++踩坑--set与重载<
    set与重载<set是有序容器,在定义容器的时候必须要指定key的比较函数。只不过这个函数通常是默认的less,表示小于关系,不用特意写出来:template<classKey,//模板参数是key类型,即元素类型classCompare=std::less<Key>//比较函数>classs......
  • HarmonyOS使用多线程并发能力开发
     一、多线程并发概述1、简介并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同时并发度也相对......
  • 【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分
    文章目录一、基础数据类型数组内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存二、类对象内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存博客总结:C语言中使用malloc分配的内存,使用free进行释放;C++语言中......
  • c++ 删除自己
     HowtowriteaprograminC++suchthatitwilldeleteitselfafterexecution?-StackOverflow #include<strsafe.h>#include<Windows.h>#defineSELF_REMOVE_STRINGTEXT("cmd.exe/Cping1.1.1.1-n1-w3000>Nul&Del/f/q......
  • 进程和线程之间区别
    进程和线程是计算机科学中重要的概念,用于描述程序执行的不同方式和组织形式。进程(Process):进程是程序的一次执行过程,是计算机系统分配资源的基本单位。每个进程拥有独立的内存空间,包括代码、数据、堆栈等,使得进程间的数据不共享,相互隔离。进程可以包含多个线程,共享该进程的......
  • 【技术研究】线程和进程
    有一句概念“进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。”分上下句去理解他吧,首先贴一张图所看到是一个进程的内存空间,分为一些栈区,堆区,一些资源区等等。“进程是操作系统资源分配的基本单位”,进程包含一个程序的执行实例,说的具体点就是他有......
  • Java中的线程池的线程数量如何确定?
    可能很多人都看到过一个线程数设置的理论:CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2不会吧,不会吧,真的有人按照这个理论规划线程数?线程数和CPU利用率的小测试抛开一些操作系统,计算机原理不谈,说一个基本的理论(不用纠结是否严谨,只为好理解):一个CPU核心,单......
  • C++学习后感
    1. C++中的new和delete分别用来分配和释放内存,它们与C语言中malloc()、free()最大的一个不同之处在于:用。构造函数和析构函数对于类来说是不可或缺的,所以在C++中我们非常鼓励使用new和delete。析构就是清除空间,构造就是初始化。2.对于一个存在着标准输入输出的C++控制台......
  • 线程一些常用功能总结
    c++11通常单例模式如下:template<typenameT>classSingleton{protected:Singleton()=default;Singleton(constSingleton<T>&)=delete;Singleton&operator=(constSingleton<T>&st)=delete;staticstd::shared_ptr&......