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.rhkb.cn/news/99118.html

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

相关文章

AutoHotKey+VSCode开发扩展推荐

原来一直用的大众推荐的SciTeAHK版,最近发现VSCode更舒服一些,有几个必装的扩展推荐一下: AutoHotkey Plus 请注意不是AutoHotkey Plus Plus。如果在扩展商店里搜索会有两个,一个是Plus,一个是Plus Plus。我选择Pllus&…

MySQL数据库概述

MySQL数据库概述 1 SQL SQL语句大小写不敏感。 SQL语句末尾应该使用分号结束。 1.1 SQL语句及相关操作示例 DDL:数据定义语言,负责数据库定义、数据库对象定义,由CREATE、ALTER与DROP三个语法所组成DML:数据操作语言&#xff…

SpringMVC之异常处理

SpringMVC之异常处理 异常分为编译时异常和运行时异常,编译时异常我们trycatch捕获,捕获后自行处理,而运行时异常是不可预期的,就需要规范编码来避免,在SpringMVC中,不管是编译异常还是运行时异常&#xff…

Redis缓存问题(穿透, 击穿, 雪崩, 污染, 一致性)

目录 1.什么是Redis缓存问题? 2.缓存穿透 3.缓存击穿 4.缓存雪崩 5.缓存污染(或满了) 5.1 最大缓存设置多大 5.2 缓存淘汰策略 6.数据库和缓存一致性 6.1 4种相关模式 6.2 方案:队列重试机制 6.3 方案:异步更新缓…

药品最新研究信息查询系统

查找最新药物研究进展信息在患者治疗选择、医疗实践、科学研究、药物监管和政策制定、教育和学术研究等方面都具有重要的应用价值。它可以为各个领域的人员提供最新的科学依据和决策支持,促进医学领域的发展和提高医疗质量。 但在查找药物最新研究进展信息时通常需要…

ChatGpt开源项目完美运行配置-ChatGml2

(以下所有软件均可免费在网盘获取。) 任务描述 本节任务是安装和配置chatgpt项目所需的软件以及chatgpt项目所需要的python库包,同时编写python代码来完成chatgpt项目的人机对话功能。 实验工具 显卡GTX1070(专用内存需要大于等…

前端PWA应用的相关知识和基础Demo

一、什么是PWA应用? 1、PWA简介 ​ 渐进式Web应用(Progressive Web App),简称PWA,是 Google 在 2015 年提出的一种使用web平台技术构建的应用程序,官方认为其核心在于Reliable(可靠的&#xf…

安装搭建私有仓库 Harbor

目录 一. 准备环境 1.1安装 Docker 1.2安装 Docker Compose 二. 下载 Harbor 安装包 三. 解压安装包 四. 配置 Harbor 五. 安装 Harbor 六. 访问 Harbor 七. 创建项目、用户和角色 一. 准备环境 确保您的服务器满足 Harbor 的系统要求。最低要求是至少 2 核 CPU、4GB…

高速、稳定、安全:4G工业路由器在户外环境下的组网优势

能够在无人值守的户外环境下实现组网和远程监控功能的4G工业路由器!工业级路由器具备防尘、防水、耐高温等特性,适用应用在恶劣的户外及工业场景中,如远程农田监测、驾考科目二/科目三、智能交通系统、环境监控、煤矿数据采集、水利远程管理等…

聚焦电力行业CentOS迁移,麒麟信安受邀参加第六届电力信息通信新技术大会暨数字化发展论坛并发表主题演讲

为加快推进“双碳”目标下的新型能源体系和新型电力系统建设,深化新一代数字技术与电力业务的融合发展,促进电力行业关键技术自主创新、安全可控,助力电力企业数字化转型升级和高质量发展,2023年8月9-11日,第六届电力信…

第一篇:编写 Hello World 程序

编写 Hello World 程序 Hello World 程序就是让应用程序显示 Hello World 字符串。这是最简单的应用,但却包含了一个应用程序的基本要素,所以一般使用它来演示程序的创建过程。本章要讲的就是在Qt Creator 中创建一个图形用户界面的项目,从而…

Java请求Http接口-hutool的HttpUtil(超详细-附带工具类)

概述 HttpUtil是应对简单场景下Http请求的工具类封装&#xff0c;此工具封装了HttpRequest对象常用操作&#xff0c;可以保证在一个方法之内完成Http请求。 此模块基于JDK的HttpUrlConnection封装完成&#xff0c;完整支持https、代理和文件上传。 导包 <dependency>&…

详细整合Spring+SpringMVC+MyBatis+logback(SSM)项目

整体目录结构 表结构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.a…

windows ipv4 多ip地址设置,默认网关跃点和自动跃点是什么意思?(跃点数)

文章目录 Windows中的IPv4多IP地址设置以及默认网关跃点和自动跃点的含义引言IPv4和IPv6&#xff1a;简介多IP地址设置&#xff1a;Windows环境中的实现默认网关跃点&#xff1a;概念和作用自动跃点&#xff1a;何时使用&#xff1f;关于“跃点数”如何确定应该设置多少跃点数&…

动态内存管理

目录 为什么要用动态内存开辟 动态内存有关函数 void* malloc (size_t size); void free (void* ptr); void* calloc (size_t num, size_t size); void* realloc (void* ptr, size_t size); C/C程序的内存开辟 柔性数组 特点&#xff1a; 柔性数组的使用&#xff1a; 为什么要用…

Nacos和GateWay路由转发NotFoundException: 503 SERVICE_UNAVAILABLE “Unable to find

问题再现&#xff1a; 2023-08-15 16:51:16,151 DEBUG [reactor-http-nio-2][CompositeLog.java:147] - [dc73b32c-1] Encoding [{timestampTue Aug 15 16:51:16 CST 2023, path/content/course/list, status503, errorService Unavai (truncated)...] 2023-08-15 16:51:16,17…

[oneAPI] 手写数字识别-GAN

[oneAPI] 手写数字识别-GAN 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛&#xff1a;https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&#xff1a;https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolki…

Linux驱动开发(Day4)

思维导图&#xff1a; 字符设备驱动分步注册&#xff1a;

Linux —— 进程间通信(System V)

目录 一&#xff0c;共享内存 申请共享内存 shmget 控制共享内存 shmctl 关联共享内存 shmat / 去联共享内存 shmdt 二&#xff0c;消息队列 创建或打开消息队列 msgget 发送消息 msgsnd / 接收消息 msgrcv 控制消息 msgctl 三&#xff0c;信号量 创建或打开信号量 s…

搭建Everything+cpolar在线资料库,实现随时随地访问

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…