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。它是如何管理线程的?线程与对象之间是如何绑定的?就非常清楚了,那后边呢?我们再看后续的代码的时候。就非常容易了好,那今天呢?我们的课就到这里,有任何的问题呢,你可以到讨论区或者是群里去给我留言,我在那里呢,给你做相应的解答好,谢谢。

回播放处

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小研究 - Android 字节码动态分析分布式框架(三)

安卓平台是个多进程同时运行的系统,它还缺少合适的动态分析接口。因此,在安卓平台上进行全面的动态分析具有高难度和挑战性。已有的研究大多是针对一些安全问题的分析方法或者框架,无法为实现更加灵活、通用的动态分析工具的开发提供支持。此…

五款拿来就能用的炫酷表白代码

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 五款炫酷表白代码 1、无限弹窗表白2、做我女朋友好吗,不同意就关机3、…

无涯教程-PHP - XML GET

XML Get已用于从xml文件获取节点值。以下示例显示了如何从xml获取数据。 Note.xml 是xml文件&#xff0c;可以通过php文件访问。 <SUBJECT><COURSE>Android</COURSE><COUNTRY>India</COUNTRY><COMPANY>LearnFk</COMPANY><PRICE…

c#设计模式-结构型模式 之 桥接模式

前言 桥接模式是一种设计模式&#xff0c;它将抽象与实现分离&#xff0c;使它们可以独立变化。这种模式涉及到一个接口作为桥梁&#xff0c;使实体类的功能独立于接口实现类。这两种类型的类可以结构化改变而互不影响。 桥接模式的主要目的是通过将实现和抽象分离&#xff0c;…

excel 核心快捷键用法

1、wps怎样只复制公示计算出来的数据 1.1、按下快捷键“CtrlC”&#xff0c;复制该单元格。 1.2、按下快捷键“ShiftCtrlV”&#xff0c;即“粘贴为数值”&#xff0c;即可只复制数字而不复制该单元格的公式 1.3、wps怎样只复制公示计算出来的数据_百度知道https://zhidao.baid…

数据结构之并查集

并查集 1. 并查集原理2. 并查集实现3. 并查集应用3.1 省份数量3.2 等式方程的可满足性 4. 并查集的优缺点及时间复杂度 1. 并查集原理 并查表原理是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0…

如何将图片应用于所有的PPT页面?

问题&#xff1a;如何快速将图片应用到所有PPT页面&#xff1f; 解答&#xff1a;有两种方法可以解决这个问题。第一种用母板。第二种用PPT背景功能。 解决有时候汇报的时候&#xff0c;ppt中背景图片修改不了以及不知道如何查找&#xff0c;今天按照逆向过程进行操作 方法1…

尚硅谷css3笔记

目录 一、新增长度单位 二、新增盒子属性 1.border-box 怪异盒模型 2.resize 调整盒子大小 3.box-shadow 盒子阴影 案例&#xff1a;鼠标悬浮盒子上时&#xff0c;盒子有一个过度的阴影效果 三、新增背景属性 1.background-origin 设置背景图的原点 2.background-clip 设置背…

【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群&#xff08;图文解说详细版&#xff09;https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…

STM32 定时器复习

12MHz晶振的机器周期是1us&#xff0c;因为单片机的一个机器周期由6个状态周期组成&#xff0c;1个机器周期6个状态周期12个时钟周期&#xff0c;因此机器周期为1us。 51单片机常用 for(){__nop(); //执行一个机器周期&#xff0c;若想循环n us&#xff0c;则循环n次。 }软件…

Streamlit项目:基于讯飞星火认知大模型开发Web智能对话应用

文章目录 1 前言2 API获取3 官方文档的调用代码4 Streamlit 网页的搭建4.1 代码及效果展示4.2 Streamlit相关知识点 5 结语 1 前言 科大讯飞公司于2023年8月15日发布了讯飞认知大模型V2.0&#xff0c;这是一款集跨领域知识和语言理解能力于一体的新一代认知智能大模型。前日&a…

Stable Diffusion原理详解

Stable Diffusion原理详解 最近AI图像生成异常火爆&#xff0c;听说鹅厂都开始用AI图像生成做前期设定了&#xff0c;小厂更是直接用AI替代了原画师的岗位。这一张张丰富细腻、风格各异、以假乱真的AI生成图像&#xff0c;背后离不开Stable Diffusion算法。 Stable Diffusion…

java 微信小程序授权获取用户手机号码 (完整demo)

1. 前端获取动态令牌 code https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html 2. 后端接收令牌code, 调用微信获取手机号接口 POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_tokenACCESS_TOKEN 3. con…

[附源码]计算机毕业设计-JAVA火车票订票管理系统-springboot-论-文-ppt

PPT论文 文章目录 前言一、主要技术javaMysql数据库JSP技术 二、系统设计三、功能截图总结 前言 本论文主要论述了如何使用JAVA语言开发一个火车订票管理系统 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想…

ORB-SLAM2学习笔记7之System主类和多线程

文章目录 0 引言1 整体框架1.1 整体流程 2 System主类2.1 成员函数2.2 成员变量 3 多线程3.1 ORB-SLAM2中的多线程3.2 加锁 0 引言 ORB-SLAM2是一种基于特征的视觉SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;系统&#xff0c;它能够从单个、双目或RBG…

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

目录 1 单位矩阵 为什么单位矩阵I是 [1,0;0,1]T 而不是[1,1;1,1]T 2 旋转矩阵 3 伸缩矩阵 放大缩小倍数矩阵 4 镜像矩阵 5 剪切矩阵 1 矩阵 1.1 1维的矩阵 行向量列向量 1.2 2维的矩阵 一般2维表都可以看作矩阵。矩阵的每个维度可以是1个数字&#xff0c;也可以是多个…

Appium-移动端自动测试框架,如何入门?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门&#xff0c;那么我们就直奔主题。文章结构如下&#xff1a; 1、为什么要使用Appium&#xff1f; 2、如何搭建Appium工具环境?(超详细&#xff09; 3、通过demo演示Appium的使用 4、Appium如何…

通讯录的实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大一&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 望小伙伴们点赞&#x1f44d;收藏✨加关注哟&#x1f495;&#x1…

深入理解分布式架构,构建高效可靠系统的关键

深入探讨分布式架构的核心概念、优势、挑战以及构建过程中的关键考虑因素。 引言什么是分布式架构&#xff1f;分布式架构的重要性 分布式系统的核心概念节点和通信数据分区与复制一致性与一致性模型负载均衡与容错性 常见的分布式架构模式客户端-服务器架构微服务架构事件驱动…

[国产MCU]-W801开发实例-GPIO输入与中断

GPIO输入与中断 文章目录 GPIO输入与中断1、硬件准备2、软件准备3、驱动实现4、驱动测试W801的GPIO支持软件配置中断,中断触发方式包含:上升沿触发、下降沿触发、高电平触发、低电平触发。本文在前面[ 国产MCU]-W801开发实例-按键与GPIO输入的基础上实现GPIO中断配置。 1、硬…