当前位置: 首页 > news >正文

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的所有其他线程都是由这三大线程所创建的。那当我们将这三个线程理解清楚之后呢?我们就知道其他线程与它们之间是怎样关系&#xf…...

@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个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…...

C++ STL无序关联式容器(详解)

STL无序关联式容器 继 map、multimap、set、multiset 关联式容器之后&#xff0c;从本节开始&#xff0c;再讲解一类“特殊”的关联式容器&#xff0c;它们常被称为“无序容器”、“哈希容器”或者“无序关联容器”。 注意&#xff0c;无序容器是 C 11 标准才正式引入到 STL 标…...

Python爬虫解析工具之xpath使用详解

文章目录 一、数据解析方式二、xpath介绍三、环境安装1. 插件安装2. 依赖库安装 四、xpath语法五、xpath语法在Python代码中的使用 一、数据解析方式 爬虫抓取到整个页面数据之后&#xff0c;我们需要从中提取出有价值的数据&#xff0c;无用的过滤掉。这个过程称为数据解析&a…...

Linux防火墙报错:Failed to start firewalld.service Unit is masked

Linux防火墙报错&#xff1a;Failed to start firewalld.service: Unit is masked. 1、故障现象&#xff1a; 启动防火墙失败&#xff0c;报错情况如下&#xff1a; systemctl start firewalld # 报错&#xff1a; Failed to start firewalld.service: Unit is masked.原因是…...

前端面试:【Vuex】Vue.js的状态管理利器

嗨&#xff0c;亲爱的Vuex探险家&#xff01;在Vue.js开发的旅程中&#xff0c;有一个强大的状态管理库&#xff0c;那就是Vuex。Vuex是Vue.js的官方状态管理工具&#xff0c;通过State、Mutation、Action和Module等核心概念&#xff0c;协助你轻松管理应用的状态。 1. 什么是V…...

Kotlin协程runBlocking并发launch,Semaphore同步1个launch任务运行

Kotlin协程runBlocking并发launch&#xff0c;Semaphore同步1个launch任务运行 <dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-coroutines-core</artifactId><version>1.7.3</version><type>pom&…...

c++ Union之妙用

union的作用基本是它里面的变量都用了同一块内存&#xff0c;跟起了别名一样&#xff0c;类型不一样的别名。 基本用法&#xff1a; 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)&#xff1a;是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集&#xff0c;采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#…...

matlab使用教程(20)—插值基础

1.网格和散点样本数据 插值是在位于一组样本数据点域中的查询位置进行函数值估算的方法。函数值是根据最接近查询点的样本数据点计算的。MATLAB 根据样本数据的结构&#xff0c;可以执行两种插值。样本数据可以形成网格&#xff0c;也可以是分散的。 网格化的样本数据使得插值…...

Python功能制作之简单的3D特效

需要导入的库&#xff1a; pygame: 这是一个游戏开发库&#xff0c;用于创建多媒体应用程序&#xff0c;提供了处理图形、声音和输入的功能。 from pygame.locals import *: 导入pygame库中的常量和函数&#xff0c;用于处理事件和输入。 OpenGL.GL: 这是OpenGL的Python绑定…...

leetcode-5-最长回文串

题目描述 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示…...

二、Oracle 数据库安装集

一、CentOS 安装 OCI下载地址 1. 启动 # 1. 登录服务器&#xff0c;切换到oracle用户&#xff0c;或者以oracle用户登录 su - oracle# 2. 打开监听服务 lsnrctl start# 3. 查看Oracle监听器运行状况 lsnrctl status# 4. 以sys用户身份登录 sqlplus /nolog# 5. 切换用户conn 用…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...