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 用…...
【Python】Python中的常用函数及用法
目录 输入输出类型转换引用哈希字符串常用操作判断类型查找替换大小写转换文本对齐去除空白字符拆分和连接 列表常用操作增删改查增删改统计排序 元组常用操作 字典常用操作 范围随机数学比较常用函数三角函数数学常量 输入 input():从键盘等待用户的输入࿰…...
基于JavaEE的ssm公司员工信息管理系统的设计与实现
基于JavaEE的ssm公司员工信息管理系统的设计与实现043 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存…...
cornerstoneJS加载图片(base、矩阵)
cornerstoneJS默认加载dicom影像数据,将识别到的dicom数据转换成imageData数据,在界面上展示。故,cornerstoneJS也可直接加载imageData。 imageData数据的data是一个数组,每四个元素代表一个点,四个元素分别表示R、G、…...
3.Trunc截断函数用法
TRUNC函数用于对值进行截断 用法有两种:TRUNC(NUMBER)表示截断数字,TRUNC(date)表示截断日期 (1)截断数字 格式:TRUNC(n1,n2),n1表示被截断的数字…...
腾讯云 CODING 荣获 TiD 质量竞争力大会 2023 软件研发优秀案例
点击链接了解详情 8 月 13-16 日,由中关村智联软件服务业质量创新联盟主办的第十届 TiD 2023 质量竞争力大会在北京国家会议中心召开。本次大会以“聚焦数字化转型 探索智能软件研发”为主题,聚焦智能化测试工程、数据要素、元宇宙、数字化转型、产融合作…...
VSCode如何为远程安装预设(固定)扩展
背景 在使用VSCode进行远程开发时(python开发之远程开发工具选择_CodingInCV的博客-CSDN博客),特别是远程的机器经常变化时(如机器来源于动态分配),每次连接新的远程时,都不得不手动安装一些开…...
一文解析HTTP与HTTPS,它们的区别和联系
一文解析HTTP与HTTPS,它们的区别和联系 HTTP和HTTPS之间不同点 尽管HTTP和HTTPS在安全性方面存在差异,但它们仍然共享许多相同的基本特征和功能。这些相同点使得HTTP成为广泛应用的标准协议,并且HTTPS作为更安全的替代方案被广泛采用。HTTP…...
Faster RCNN网络数据流总结
前言 在学习Faster RCNN时,看了许多别人写的博客。看了以后,对Faster RCNN整理有了一个大概的了解,但是对训练时网络内部的数据流还不是很清楚,所以在结合这个版本的faster rcnn代码情况下,对网络数据流进行总结。以便…...
拒绝摆烂!C语言练习打卡第五天
🔥博客主页:小王又困了 📚系列专栏:每日一练 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、选择题 📝1.第一题 📝2.第二题 Ὅ…...
关于LambdaQueryWrapper.or()导致错误
这个是原始的代码,到导致一个问题,后面所有的内容,都在这个or的右边,也就是整个查询语句就这一个or,而很明显( xxx or xxx)and()这才是我们要的,所以需要将这…...
一键开启网站/免费发帖推广平台有哪些
该用法和java的if else if else用法类似,如果能在sql中写这种判断比在java代码中写会更简洁美观。 1、mysql方式: SELECT NAME, (CASE DEGREE WHEN 70 THEN 7 WHEN 80 THEN 8 WHEN 90 THEN 9 END ) AS DEGREE FROM COURSE (1)当degree值为70时ÿ…...
做网址导航网站/java培训班
Oracle中SEQUENCES的使用 Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方. 下面介绍一下关于sequence 的生成,修改,删除等常用的操作: 1. 创建 Sequence 使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者…...
网络服务器无响应原因/重庆百度搜索优化
paramiko 登录linux主机后执行tail后返回数据不完整解决方法。参考文章: (1)paramiko 登录linux主机后执行tail后返回数据不完整解决方法。 (2)https://www.cnblogs.com/leomo/p/5724909.html 备忘一下。...
东营网站制作公司/开发一个网站的步骤流程
转载自http://blog.csdn.net/hbhhww/article/details/8152838栈与堆都是Java用来在Ram中存放数据的地方。与C不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。Java的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewa…...
永久免费的自助建站/网络营销方式有哪几种
1、setValue:forUndefinedKey:this class is not key value coding-compliant for the key latitudeLabel. 首先你通过xib界面,按ctrl键拖动,生成输出口,命名为aa;然后通过代码修改成bb;这时运行时会报上述错误。其实…...
投注网站建设需要多少钱/免费搭建网站的软件
03月23日,钛博士机器人侦测到 25 起发生在科技和互联网行业的投融资或并购事件,其中 11 起发生在中国境内,14 起发生在海外,总计交易额超过118.26亿人民币。中国境内科技行业投融资总额约5.52亿人民币,单笔最大交易事件…...