5.6.webrtc三大线程
那今天呢?我们来介绍一下web rtc的三大线程,那为什么要介绍这三大线程呢?最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢?我们就知道其他线程与它们之间是怎样关系,那也就知道了。y8 rtc底层逻辑处理的时候。线程是如何进行切换的?所以了解这三大线程呢?对于我们理解y边儿7c就是非常重要的意义。好,
那下面呢?我们就来看看外拔tc的三大线程,包括哪三个,
第一个呢?就是信号线程,通过这个名字啊,我们基本上也可以猜到它的作用是什么了。就是用于以应用层进行交互。当应用层调用外部r7c的API的时候,进入到API内部,它就会进行线程的切换,从应用层的线程切换到信号线程。
当它做底层逻辑处理的时候呢,又会从信号线程切换到工作线程,所以这是信号线程的主要作用。
好,那第二个重要的线程呢?就是工作线程,那工作线程的作用是负责内部逻辑的处理。所有底层的核心的逻辑都是由工作线程来完成的。
第三个线程呢?是网络线程,网络线程非常简单,就是负责网络数据包的收发,对吧?那这三个线程之间是怎样的关系呢?
实际上工作线程是最为核心的线程。我们来举一个例子啊。当网络线程收到数据包之后。那它首先要把数据包交给谁呢?
交给工作线程,由工作线程做一些逻辑的处理。比如说。是把这个rtb包包头去掉。然后留里边的pllo的数据。还有将多个rtb包组成一个视频帧,这些工作呢,都是由工作线程来完成的。
那当工作线程处理好这些任务之后呢?比如说应用层要收到一些反馈的信息。那这个时候呢,工作线程会将这个信息交给信号线程,信号线程最终传给应用层。
那现在呢?我们就应该知道那外部rtc这三大线程,它主要干了哪些活儿?那了解了它们的主要功能之后呢?下面咱们就来看一下代码。
看看外边儿tc中是如何启动这三大线程的好,我们切换到Windows系统下。那我们依然是从peer connection client这个项目出发来看一下这三大线程是如何创建的。好,那我们进入到慢点CC的文本函数中,那在这个80行呢?我们先设一个断点。实际上,80行跟81行我们在前面的课程中都向你做过详细介绍,对吧?这两行的主要作用。
就是将当前的主线程与win 3 r three的对象做一次绑定。那绑定的目的是什么呢?一会儿我们就会看到我们先将程序运行起来。好,这个时候呢,程序就执行到了men点CC的80行。那我们单步执行一下啊,当我们执行完81行之后呢,我们来看看。win三二three的对象,它的地址是多少?我们可以通过下边的自动窗口来看一下win 3 r three的对象的地址是三五三f。八那现在呢?我们先把这个地址给它记录下来,那一会儿呢,
我就会告诉你,我们记这个地址是干什么用的?好,那我们继续执行。连接心理服务器。选择一个我们要通信的对端。这时候呢,程序就执行到了conductor点CC的133行。那我在133行呢,设置了一个断点。那这行代码呢?实际大家应该都非常清楚,我在之前的课程中呢,也向你做过介绍,那它就是创建。
这个对象对吧?在创建peer connection factory这个对象的时候呢,有三个非常重要参数。分别是网络线程对象,工作线程对象以及信令线程对象。
通过这三个参数啊,我们可以知道,如果我们想自己控制这三个线程,我们就可以将这三个线程。及其对象创建好,那把它当做参数,传到这个API中,那这样呢?在y8 rtc底层,它就会使用我们创建好的三个线程。
进行底层的操作了,那如果我们觉得麻烦,你也可以在这里设置成null。那这样呢,在create peer connection factory内部,它就会自动为我们创建好这三个线程。
所以通过这个API,我们就可以知道这三个线程,就是在create peer connection factory内部创建的,对吧?那下面呢,我们就可以跳到这个API内部来看一下它具体是怎么做的?好,我们继续执行。实际上,
在这个API内部啊。它一开始是将所有的参数打包到了。dependency这个对象中。那之所以要创建这个对象呢,是因为它还要调用底层的逻辑,那底层逻辑我们要传很多参数的话就比较麻烦。还不如将它们都打包到一个对象中,这样我们只要传一个对象就OK了。那这一块逻辑呢就是。将我们的参数一项一项的塞到dependence对象中。当所有的参数都设置好之后呢?
它会调用create modular peer connection factory,这个方法我们继续执行。那在create modular peer connection factory这个方法中呢,它首先通过new创建了一个peer connection factory对象。
那么咱们来看一下peer connection factory构造函数中做了哪些事情?那首先呢,它会将dependencies中的这个成员呢,一项一项的拿出来设置到peer connection factory对象中。包括了network three的worker threed。signal three的pass query factory等等等,这一系列的参数对吧?这我们就不看了,那之后呢,在它的主逻辑中首先判断。network three的是否为空?如果为空,它就会在内部调用。
create with socket server方法。来创建three的对象。当three的对象创建好之后呢,它调用start方法将这个线程启动起来,那现在我们就知道network three的这个对象,它是在哪创建的,以及这个线程。
是如何启动起来的?那关于这个线程,具体内部的启动逻辑呢?我这里就不往下跟了,那后边儿呢?我还会向你做详细介绍,那现在我们只要知道。这一块逻辑就是来启动network three的这个线程的network,three的创建好之后呢,紧接着它会判断。
worker three的那逻辑呢?也是类似的,只不过这次创建three的对象的时候呢,它使用了create方法。而不是create with socket server这个方法,那这两个方法有什么区别呢?关键的一个区别就在于。create with socket server,它是用于处理网络事件的,而create呢,它不处理网络事件,只是一个普通的事件。所以这是它们的一个最大区别。
那除了线程事件不同之外呢,其他地方都是一样的,那它同样通过start来启动这个线程。好,我们继续弹幕执行。
那第三个呢,它就处理signal three的。通过这句话,我们可以看到啊,对于y8 rtc来说,它默认把应用的主线程当做。信令线程对吧?所以它调了three的current这个方法,那为了更好的了解这段逻辑啊,我们来看一下three的current。这个函数内部它是如何实现的?
OK,在street current这个API内部呢?他首先获得street manager这个对象。之后呢,调用current three的方法来获取线程对象。那我们再来看看current它做了哪些事情。
在current three的内部,它只有一行代码,就是调用tls get value这个方法,那这个方法实际我们在上节课向你做过介绍。它作用是从线程本地存储空间中读取,当前线程保存的值这个值呢,实际应该是在之前。通过tls set value来设置的,那如果你现在还记得上节课,
我们介绍的thread manager那张图的话。那你就知道这个函数,它的含义是什么了?好,那现在我们再联想我们之前介绍中的80行和81行的时候,就已经将win三二three的。设置到manager three的对象中了,所以这个时候我们再要用get value这个API,我们就可以将之前。
设置的这个线程呢,给它获取出来,也就是主线程,所以current three的这个API的返回值呢,一定是我们之前创建的这个主线程的。win 3 r three的对象地址对吧?
好,那么我们执行一下,咱们来看一下这个three的,它的地址是多少?就是三五三七f八。至于我们一开始看81行的v3r three的对象的地址是一模一样的,对不对?所以从这一点上,我们就可以看到,通过current这个API对于y八二tc来说,它就拿到了应用程序的主线程。作为它的心灵线程了,那么继续执行好,当这个函数返回之后呢?它赋给了信令线程,(main函数创建的thread作为主线程)
现在的信令线程就是peer connection clan的,这个应用程序的主线程。好由于此时呢,这个signal three的已经不为空了,那这样呢,就直接跳出去了。那到这个时候呢,我们就将web rtc的三大线程全部创建出来了。好,那再往后,它就会做一次线程的切换,也就是说,从当前线程切换到新的线程,那一块逻辑的切换呢?其实还是蛮复杂的,
那我会在后边给你做更详细的介绍。对于我们今天的课来说呢,主要就是介绍三大线程的创建。他们是什么时候创建的?创建的位置是在哪?那现在呢?我们都非常清楚了,那以上呢?就是我们这节课。所要向你介绍的内容,在这节课中呢,我向你介绍了y八二tc有三个非常重要的线程,分别是信号线程,工作线程以及网络线程。那另外呢,
在课程中我还通过阅读代码的方式向你介绍了这三大线程是什么时候创建的,对吧?尤其是信号线程。对于我们的一般应用程序来说呢,如果你不做特殊的处理,它就会使用主线程,当做信号线程。但是对这三个线程来说呢,实际我们在写应用程序的时候,可以自己先把它创建好,然后传给外部rtc,让外部rtc用我们创建好的线程来做底层的处理。如果你觉得这种方式比较繁琐的话,你可以直接让y八二tc在底层做线程的创建。是吧,
这都是完全可以的好,那以上呢,就是我们这节课所介绍的内容好,谢谢。
相关文章:

5.6.webrtc三大线程
那今天呢?我们来介绍一下web rtc的三大线程,那为什么要介绍这三大线程呢?最关键的原因在于web rtc的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢?我们就知道其他线程与它们之间是怎样关系…...

@Slf4j报错:Not generating field log: A field with same name already exists
错误出处: 错误原因: 同时使用了Slf4j注解以及LittlecLogger private static final LittlecLogger log LittlecLoggerFactory.getLogger(TimeTrackController.class); 修复方法: 将log改为LOG,便于区分,代码即用到了…...

乖宝宠物上市,能否打破外资承包中国宠物口粮的现实
近日,乖宝宠物上市了,这是中国宠物行业成功挂牌的第三家公司。同时,昨日,宠物行业最大的盛事“亚洲宠物展”时隔3年,于昨日在上海成功回归。 这两件事情的叠加可谓是双喜临门,行业能够走到今天实属不易&…...

Ubuntu安装Apache+Php
环境:ubuntu 22.04 虚拟机 首先更新一下 sudo apt-get update sudo apt-get upgrade安装Apache2: sudo apt-get install apache2 输入y,继续。等着他恐龙抗浪抗浪的下载安装就好了 打开浏览器访问http://localhost/ 安装php: …...
open cv学习 (四)图像的几何变换
图像的几何变换 demo1 # dsize实现缩放 import cv2 img cv2.imread("./cat.jpg") dst1 cv2.resize(img, (100, 100)) dst2 cv2.resize(img, (400, 400)) # cv2.imshow("img", img) # cv2.imshow("dst1", dst1) # cv2.imshow("dst2&quo…...

matlab 检测点云中指定尺寸的矩形平面
目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数名称-值对应参数输出参数五、参考链接一、概述 1、算法概述 detectRectangularPlanePoints:检测点云中指定尺寸的矩形平面 <...

HCIP——STP配置案例
STP配置案例 一、简介二、实现说明1、华为实现说明2、其他厂商实现 三、STP原理1、协商原则2、角色和状态3、报文格式4、BPDU报文处理流程4.1 BPDU报文的分类4.2 BPDU报文的处理流程4.3 BPDU报文格式 四、使用注意事项五、配置举例1、组网需求2、配置思路3、操作步骤4、配置文件…...

JCTools Mpsc源码详解(二) MpscArrayQueue
MpscArrayQueue是一个固定大小的环形数组队列,继承自ConcurrentCircularArrayQueue MpscArrayQueue的特点: 环形队列底层数据结构为数组有界 看一下MpscArrayQueue的属性(填充类除外)--- //生产者索引 private volatile long producerIndex; //生产者边界 private volatile…...
前端面试的性能优化部分(13)每天10个小知识点
目录 系列文章目录前端面试的性能优化部分(1)每天10个小知识点前端面试的性能优化部分(2)每天10个小知识点前端面试的性能优化部分(3)每天10个小知识点前端面试的性能优化部分(4)每天…...
C++ STL无序关联式容器(详解)
STL无序关联式容器 继 map、multimap、set、multiset 关联式容器之后,从本节开始,再讲解一类“特殊”的关联式容器,它们常被称为“无序容器”、“哈希容器”或者“无序关联容器”。 注意,无序容器是 C 11 标准才正式引入到 STL 标…...

Python爬虫解析工具之xpath使用详解
文章目录 一、数据解析方式二、xpath介绍三、环境安装1. 插件安装2. 依赖库安装 四、xpath语法五、xpath语法在Python代码中的使用 一、数据解析方式 爬虫抓取到整个页面数据之后,我们需要从中提取出有价值的数据,无用的过滤掉。这个过程称为数据解析&a…...
Linux防火墙报错:Failed to start firewalld.service Unit is masked
Linux防火墙报错:Failed to start firewalld.service: Unit is masked. 1、故障现象: 启动防火墙失败,报错情况如下: systemctl start firewalld # 报错: Failed to start firewalld.service: Unit is masked.原因是…...
前端面试:【Vuex】Vue.js的状态管理利器
嗨,亲爱的Vuex探险家!在Vue.js开发的旅程中,有一个强大的状态管理库,那就是Vuex。Vuex是Vue.js的官方状态管理工具,通过State、Mutation、Action和Module等核心概念,协助你轻松管理应用的状态。 1. 什么是V…...
Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行
Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom&…...
c++ Union之妙用
union的作用基本是它里面的变量都用了同一块内存,跟起了别名一样,类型不一样的别名。 基本用法: struct Union{union {float a;int b;};};Union u;u.a 2.0f;std::cout << u.a << "," << u.b << std::endl…...

JSON的处理
1、JSON JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#…...

matlab使用教程(20)—插值基础
1.网格和散点样本数据 插值是在位于一组样本数据点域中的查询位置进行函数值估算的方法。函数值是根据最接近查询点的样本数据点计算的。MATLAB 根据样本数据的结构,可以执行两种插值。样本数据可以形成网格,也可以是分散的。 网格化的样本数据使得插值…...

Python功能制作之简单的3D特效
需要导入的库: pygame: 这是一个游戏开发库,用于创建多媒体应用程序,提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数,用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…...
leetcode-5-最长回文串
题目描述 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示…...
二、Oracle 数据库安装集
一、CentOS 安装 OCI下载地址 1. 启动 # 1. 登录服务器,切换到oracle用户,或者以oracle用户登录 su - oracle# 2. 打开监听服务 lsnrctl start# 3. 查看Oracle监听器运行状况 lsnrctl status# 4. 以sys用户身份登录 sqlplus /nolog# 5. 切换用户conn 用…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...