5.5.webrtc的线程管理

今天呢,我们来介绍一下线程的管理与绑定,首先我们来看一下web rtc中的线程管理类,也就是thread manager。对于这个类来说呢,其实实现非常简单,对吧?

包括了几个重要的成员,第一个成员呢就是instance成员,通过这个名字,我们也可以知道它属于单例模式。那通过instance呢,我们就可以拿到thread manager这个对象了,

对吧?这是第一个thread manager的第二个成员呢,是message。通过它的类型啊,我们可以知道这个呢,就是存放所有y8 rtc中的线程对象的,那它是一个victor,也就是一个数组。在这个数组中呢,可以存放three的类型的指针。

再接下来呢,是一个临界区。security section对于message里边的所有线程的操作读啊取啊都要对它先进行加锁,那只有获得锁之后呢才能操作这个队列。

在这里插入图片描述

再接下来这个k呢也十分关键,它属于three的local storage的内容,关于这部分知识呢,一会儿我会向你做详细介绍。那我们现在再来看three的manager这个类,那它有一个最主要的成员就是message,除此之外呢,还有一个k那这个k呢,现在大家还不知道什么意思,那一会儿呢,我就会讲到。

那我们来看看thread manager,它是如何管理线程的?实际上,对于thread manager来说呢,它有两个队列,第一个队列就是我们刚才介绍的message q。在它里边儿呢,可以存放很多的线程对象,那除了这个message之外呢,

还有一个k。那这个k是什么作用呢?就是three的local storage,也就是专门用于本地线程存储的。那你可以把它想象成是一个map表,对吧?它的k呢?就是一个线程ID值呢?
在这里插入图片描述

可以是任意对形的对象。那对于外边rtc来说呢,它里边存放的就是three的指针,这个map与three的manager中的message q每一项呢都是一一对应的,也就是说第一项的three的对应这里的。tid thread第二项呢?对应第二项

就是一一对应这张图对于我们理解thread manager来说是非常关键的。如果我们对这个结构不清楚的话,你就很难理解thread manager它里边的逻辑为什么要那么实现?只有我们把这个图搞清楚了之后,我们才能理解它里边的逻辑,那除此之外呢,

对于message crease中的。每个three的对象都是由构造three的时创建的,而对于k中的每一项呢,是在线程执行的时候。通过set current three的来设置的,那现在呢我们只需要记住这两点就OK了,

第一点呢就是我们message query中的每一个three的。它是在线程的构造函数中创建的,属于three的local story中的内容呢?

是在当前线程执行的时候。调用来设置的那下面呢?我们来具体介绍一下three的local storage。那关于three的local storage呢,应该是在C加加幺幺引入的对,所以它引入的时间呢,并不是很长,下面呢,我们来看看three的local storage,它的一些基本用法。
在这里插入图片描述

第一个呢,就是tls I lock,那tls呢,就是thread local storage的缩写。I lock就是分配的意思,那对于这个函数来说呢?它返回的是一个全局的索引值。当然,在底层的内存中呢,实际就分配一个map,有k有value okay,那这里返回的这个索引值是什么意思呢?实际上,对于我们系统中的每一个进程来说,它都有一个唯一的索引值,

也就说每一个进程一块空间。在这个空间中呢,它里边是一个map表,而为了索引到这个空间,它有一个索引值。比如我一号进程,它的索引值可能是一二号进程,它的索引值可能是二,以此类推就是大概这个意思。总之呢,它是通过索引值来找到这块内存空间的,这个呢,就是tls I这个函数的作用。好,那有了这个空间之后呢,

我们就可以用tls set value来向I lock分配的这个空间里边插入值。插入的内容呢,就是tid和date,当然我们存放的时候对于tls set value来说,你应该输入两个参数。第一个参数呢就是tls I lock返回的这个索引值,那第二个值呢就是我们要存入的数据。

而在内存中呢,它真正存放的是tid和data,那它是怎么找到的呢?实际上就是根据你传入的这个索引值,也就是tls I lock。产生的这个索引值找到内存中的这个map之后呢,再获取你当前线程的线程ID。之后把线程ID当做k你存入的data为value,
在这里插入图片描述

这样呢,将这个k value对儿插入到map中就是这样一个简单的过程。那它提供的第三个就是get value,也就是说从内存中通过当前线程ID获取到我们之前存储的值。它主要呢就是这三个函数对于web rtc,它在使用的时候呢,也是一直用的这三个函数,

那接下来呢,我们来看一个实例,就是来查看一下peer connection c。demo程序中的主线程与three的线程是如何绑定的?我们切换到Windows系统下。OK好,我们还是打开peer connection clan的这个项目之后呢,找到men点CC这个文件,
在这里插入图片描述

那在这里边呢,我们找到。文本中的第81行也就是这一句。通过这行语句呢,实际就实现了。主线程与前面我们创建的win四二three的对象的绑定,现在我们应该清楚上节课我们介绍的win四二three的对象。实际它就是一个线程对象,并不是一个真正的线程,而对于我们peer connection clan端来说呢,它现在的主线程已经启动起来了。那如何将主线程与我们前面创建的对象绑定起来?秘密就在于set current three的这个函数。那下面呢,我们就跳到这个函数中看一下它是如何实现的。
在这里插入图片描述

好,那在three的manager的set current three的方法中呢?实际就调用了set current three的internal。这个方法对吧?我们继续跳进去。那在这个函数中呢,我们看到只有一条语句,就是tls set value。这个k呢,就是我们刚才介绍的这个索引值,它是通过tls I lock分配的。
在这里插入图片描述
对于sweet manager来说,这个k是什么时候产生的呢?实际就是在它的构造函数,我们看一下281行。

它的构造函数中呢,调用了tls I lock方法,最终获得我们本地线程的存储空间。并将索引值呢复制给k。
在这里插入图片描述

那么,在调用set current three的internal方法的时候呢,就可以直接将我们之前创建的three的对象指针。当做参数设置到k所指定的内存空间中,那这样呢,我们就看到了两个方法的使用,那第一个呢是线程本地空间的分配。第二个呢,是向线程本地空间存储,我们自己的数据。那由于我们现在是在主线程内执行的,

所以呢,对于存储到内存中的值一定是我们当前线程的线程ID与我们要存入的线程对象的指针。形成了一个ky 6对儿,存放到了内存空间中,对吧?好,那通过这种方式呢,就实现了当前线程与three的对象之间的绑定。
在这里插入图片描述

其实还是非常好理解的,对吧OK那了解了当前线程与three的对象的绑定,那下面呢,我们再来看看three的对象是什么时候插入到three的many中中的。那这个时候呢,我们就要看一下win 3 r t hree的这个类的实现了。那我们跳到这个类中win三二three的类是继承自three的类的好,
在这里插入图片描述

我们继续跳到three的类的实现。那在这里边儿呢,比较关键的一点是它的构造函数对吧?我们要弄清three的对象,创建好之后是什么时候插入到three的manager中的?必须要看一下它的构造函数的视线。我们跳到它的构造函数中,对于three的对象的构造函数呢?上节课已经向你介绍过它有多种空载。包括了socket server指针,智能指针,智能指针加do I it,对吧?那通过这个代码,我们可以发现啊,

实际所有的构造函数,最终呢,都会调用。这个构造函数我们来看一下,在这个构造函数中,它做了哪些事情?
在这里插入图片描述
其中比较关键的一点就是调了。我们进入到doin it那,在这个函数中做了什么事儿呢?我们看一下372行,那在这里呢?执行了一条语句,就是将。这次指针插入到three的manager中,我们可以继续往下跳,
在这里插入图片描述

找到add,再找到add internal。在add internal函数中的129行,我们就可以看到它。
在这里插入图片描述
最终呢,将message query加入到了。message query中,而message query就是一个three的对象指针对吧?这样呢,我们就将整个的逻辑搞清楚了,再切回到WI MI函数的80行和81行。通过这两条语句呢,我们就可以知道在80行是创建了一个win三二three的,在创建好之后就被插入到three的manager中了。对吧,

之后呢,他又调用了set current three的这个方法,将当前线程与我们刚才创建的win cr three的对象。进行了绑定,那这样呢,就使得当前线程与three的对象产生了一对一的关系。(队列和对象绑定,对象和线程绑定,队列和线程绑定)

那之后呢,我们就可以利用win 12 three的对象中的队列进行消息处理了。那以上呢,就是web rtc three的对象与线程进行绑定的一个过程,那经过刚才我们代码的分析呢,我们现在已经知道web rtc。线程与线程对象之间是如何进行绑定的?是如何进行管理的了?对吧?

其中的核心点呢?就是这张图。如果你对这张图非常熟悉的话,那就知道它的逻辑其实非常的简单,如果这张图你不了解的话,不知道还有three的local storage。这个map表儿的话,你就很难理解y8 rtc线程是如何管理的,那有些看了我书的同学呢,就对这一块儿逻辑不太清楚,像我提出了很多问题。根本的原因呢,就在于我书中没有对这块儿知识做详细介绍,所以他们无法理解,那现在呢,
在这里插入图片描述

大家了解了这块儿知识之后呢,应该对外边儿tc的street manager。它是如何管理线程的?线程与对象之间是如何绑定的?就非常清楚了,那后边呢?我们再看后续的代码的时候。就非常容易了好,那今天呢?我们的课就到这里,有任何的问题呢,你可以到讨论区或者是群里去给我留言,我在那里呢,给你做相应的解答好,谢谢。

回播放处

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/82880.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记230804---逻辑跳转this.$router.push在写法上的优化

今天和资深前端代码写重,同时写页面带参跳转,组长觉得他写的方式比我高端一点,我觉得确实是,像资深大佬学习。 我的写法: this.$router.push(/bdesign?applicationId${this.data.id}&appName${this.data.name})…

[VS/C++]如何更好的配置DLL项目中的成品输出

注意,解决方案与项目不放在同一个文件夹中,即不选中图中选项 直入主题 首先右键项目选择属性,或者选中项目然后AltEnter 选择配置属性下的常规 分别在四种配置中编辑输出目录如下 注意,四种配置要分别配置,一个个来…

一百六十一、Kettle——Linux上安装的kettle9.2开启carte服务(亲测、附流程截图)

一、目的 在Linux上安装好kettle9.2并且连接好各个数据库后,下面开启carte服务 二、实施步骤 (一)carte服务文件路径 kettle的Linux运行的carte服务文件是carte.sh (二)修改kettle安装路径下的pwd文件夹里的服务器…

Netty+springboot开发即时通讯系统笔记(四)终

实时性 1.线程池多线程,把消息同步给其他端和对方用户,其中数据持久化往往是最浪费时间的操作,可以使用mq异步存储,因为其他业务不需要拿着整条数据,只需要这条数据的id进行操作。 2。消息校验前置,放在t…

谷歌推出首款量子弹性 FIDO2 安全密钥

谷歌在本周二宣布推出首个量子弹性 FIDO2 安全密钥,作为其 OpenSK 安全密钥计划的一部分。 Elie Bursztein和Fabian Kaczmarczyck表示:这一开源硬件优化的实现采用了一种新颖的ECC/Dilithium混合签名模式,它结合了ECC抵御标准攻击的安全性和…

机器学习与模式识别3(线性回归与逻辑回归)

一、线性回归与逻辑回归简介 线性回归主要功能是拟合数据,常用平方误差函数。 逻辑回归主要功能是区分数据,找到决策边界,常用交叉熵。 二、线性回归与逻辑回归的实现 1.线性回归 利用回归方程对一个或多个特征值和目标值之间的关系进行建模…

java版本spring cloud 企业工程系统管理 工程项目管理系统源码em

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

消息中间件的选择:RabbitMQ是一个明智的选择

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! MQ(Message Queue) MQ(消息队列)是一种用于在应用程序之间进行异步通信的技术;允许应用程序通过发送和接收…

Vue3 用父子组件通信实现页面页签功能

一、大概流程 二、用到的Vue3知识 1、组件通信 (1)父给子 在vue3中父组件给子组件传值用到绑定和props 因为页签的数组要放在父页面中, data(){return {tabs: []}}, 所以顶部栏需要向父页面获取页签数组 先在页签页面中定义props用来接…

CloudCompare——统计滤波

目录 1.统计滤波2.软件实现3.完整操作4.算法源码5.相关代码 本文由CSDN点云侠原创,CloudCompare——统计滤波,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 1.统计滤波 算法原理见:PCL 统计滤波器…

Cpp学习——类与对象3

目录 一,初始化列表 1.初始化列表的使用 2.初始化列表的特点 3.必须要使用初始化列表的场景 二,单参数构造函数的隐式类型转换 1.内置类型的隐式类型转换 2. 自定义类型的隐式类型转换 3.多参数构造函数的隐式类型转换 4.当你不想要发生隐式类型转换…

CPU缓存一致性原理

CPU缓存一致性原理 在本站的文章CPU缓存那些事儿中, 介绍了cpu的多级缓存的架构和cpu缓存行cache line的结构。CPU对于缓存的操作包含读和写,读操作在cache line中有所涉及,在本文中,将重点讨论CPU对于缓存进行写时的行为。 单核…

美国大模型风向速报(一)为何重视提示工程?LangChain+向量数据库+开源大模型真香...

多家,且独家来自美国的信源同时向“亲爱的数据”表示, 提示工程(Prompt Engineering)在美国大模型领域备受重视。 读者都要聊, 那就干活。 (一)开源真香 现阶段,AI开源极客大展身手&…

【视觉SLAM入门】5.2. 2D-3D PNP 3D-3D ICP BA非线性优化方法 数学方法SVD DLT

"养气之学,戒之躁急" 1. 3D-2D PNP1.1 代数法1.1.1 DLT(直接线性变换法)1.1.2. P3P 1.2 优化法BA (Bundle Adjustment)法 2. 3D-3D ICP2.1 代数法2.1.1 SVD方法 2.2 优化(BA)法2.2.2 非线性优化方法 前置事项: 1. 3D-2D PNP 该问题描述为&am…

线性代数的学习和整理7:各种特殊矩阵(草稿-----未完成)

目录 1 单位矩阵 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 2 旋转矩阵 3 伸缩矩阵 放大缩小倍数矩阵 4 镜像矩阵 5 剪切矩阵 矩阵 行向量 列向量 方阵 1 单位矩阵 [ 1 0 0 1] 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 因为 矩阵 [1,0;0,1] 代表…

websocket + stomp + sockjs学习

文章目录 学习链接后台代码引入依赖application.ymlWebSocketConfigPrivateControllerWebSocketService WebSocketEventListenerCorsFilter 前端代码Room.vue 学习链接 WebSocket入门教程示例代码,代码地址已fork至本地gitee,原github代码地址&#xff…

马哈鱼数据血缘工具背后的项目: gsp_demo_java 项目简单介绍与使用

0.背景 马哈鱼数据血缘工具(https://www.sqlflow.cn/)是SQLflow工具的中文译名,实际就是sqlflow. 对于SQL flow来说,底层调用的是General SQL Parser(GSP https://sqlparser.com) 的库. 这个gsp有开源的java demo项目:https://github.com/sqlparser/gsp_demo_java 1.快速使用…

【C# 基础精讲】LINQ 基础

LINQ(Language Integrated Query)是一项强大的C#语言特性,它使数据查询和操作变得更加简洁、灵活和可读性强。通过使用LINQ,您可以使用类似SQL的语法来查询各种数据源,如集合、数组、数据库等。本文将介绍LINQ的基础概…

(排序) 剑指 Offer 45. 把数组排成最小的数 ——【Leetcode每日一题】

❓ 剑指 Offer 45. 把数组排成最小的数 难度:中等 输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [10,2] 输出: “102” 示例 2: 输入: [3,30,34,5,9] 输出: “3033459”…

PV3D: A 3D GENERATIVE MODEL FOR PORTRAITVIDEO GENERATION 【2023 ICLR】

ICLR:International Conference on Learning Representations CCF-A 国际表征学习大会:深度学习的顶级会议 生成对抗网络(GANs)的最新进展已经证明了生成令人惊叹的逼真肖像图像的能力。虽然之前的一些工作已经将这种图像gan应用于无条件的2D人像视频生…