5.7.webrtc线程的启动与运行

那在上一节课中呢?我向你介绍了web rtc的三大线程,包括了信令线程,工作线程以及网络线程。那同时呢,我们知道了web rtc 3大线程创建的位置以及运行的时机。

对吧,那么今天呢?我们再继续深入了解一下,看这些线程是如何创建的,以及如何运行的。

那首先呢,我们来看看线程的创建,实际这一页PPT啊,我们在之前已经向你做过介绍了,那我们都知道,对于不同的平台,在创建线程时使用的API都是不一样的,对吧?对于linux以及mac来说呢,它使用的是p three create来创建线程,而对于WINDOWS来说呢?它使用的是create three的来创建线程zur rtc,由于它是支持多平台的。

在这里插入图片描述

所以,对于不同平台的版本,它的代码也是不一样的。那这些呢,我们都需要了解。

今天呢,我们就来详细看一下p three的create以及create three的这两个API。
在这里插入图片描述

它的一些具体参数首先我们来看一下WINDOWS下的create three它都有哪些参数。那我们从这里可以看到啊,对于create three的API来说,它包含的参数还是蛮多的,一共有六项,

那第一项呢,是线程的属性。那一般情况下,这个参数呢?我们都设成了NULL,也就是说采用默认的线程属性,

第二个参数呢?是线程创建好之后使用的堆栈大小,如果我们设置成零,它也是使用默认的堆栈大小。那如果我们对这个堆栈啊,有特殊的要求,你可以在这里进行设置

第三个参数就比较重要了。那它表示的是我们线程启动之后要执行哪个函数,所以这里呢是一个函数地址。

那第四个呢?是参数什么参数呢?就是我们前面设置的这个函数的输入参数。对于这个函数来说呢,它只能有一个输入参数好,

再接下来create flags表示的是创建时设置的一些flag。那通常情况下,我们也设置成零零表示,当线程创建好之后,就立刻参与线程的调度,所以一般情况下呢,我们都将它设成零。

好,最后一个参数,如果我们在创建线程的时候设置了这个参数,那当线程创建好之后就会给我们返回一个线程ID。它呢,其实是一个输出参数,对吧?那下面呢?

我们来看一下web rtc是如何使用create three的这个API的。我们这个例子中所展示这样,那这个呢?就是我从外边tc中拷贝的一段代码,

在这里插入图片描述

那它第一个参数呢?就成了。采用默认的线程属性。第二个参数呢,是零使用默认的堆栈大小。好,第三个参数是pre run。代表要执行哪个函数?第四个呢?是这个函数的输入参数web rtc呢?是将这次传给preturn,第五个参数设成零,就是创建好之后呢,立即参与调度。最后一个参数呢,就是获取我们创建好的线程ID。
在这里插入图片描述

这就是create three的API,那接下来呢,我们再看看linux下的p three的create这个API。对于这个API来说呢,它的参数相对少一些,一共有四项对吧?

那第一项呢是p three的杠t类型的。它表示,当我们创建好线程之后呢,在这个变量中存放一些关于这个线程的基本信息。这是第一个参数,

第二个参数呢?也是线程属性,一般情况下呢,我们只要使用p three的相关的API。给它做一下初始化就OK了,也就是说采用默认的属性。

第三个参数与create three的是类似的,也是一个执行函数。那这个执行函数呢?

也有一个输入参数,也就是第四个参数arg,那这个呢?就是p three的create这个API。
在这里插入图片描述

那我们接着来看一个例子。那对于这个API来说呢,

它的第一个参数是我们创建的p three的杠t类型的一个变量地址,对吧?
那第二个参数呢,是我们创建的的杠attr杠t类型的一个变量地址。
第三个参数是一个执行函数,

最后一个参数呢?一般是我们当前的这个对象,

这就是p three的create API。好,那了解了这两个API之后呢?下面我们再来看看,当我们程序运行起来之后,它的一个基本逻辑是什么?

在这里插入图片描述

其实这一块儿啊,我在前面儿介绍常见的线程模型的时候,我已经向你做过基本的介绍了,其实在执行函数的内部。就是一个外循环,而且是一个死循环,那么在这个循环中,它做什么事儿呢?就做两件事儿,第一件事儿呢,就是从堆列中。取出message消息。当拿到这个消息之后呢,调用dispatch来处理这个消息。(执行函数,拿到消息,让谁处理)

我们再来看看dispatch,在dispatch中它会调用这个消息的handler对象的on message进行逻辑处理。同时,把正在处理的这个消息呢,当做参数。传给内部呢,它就会对这个消息做相应的逻辑处理了,那具体是怎么做的?

每一个消息有不同的逻辑,这就是把控制权交给了发送线程。发送线程在执行逻辑的时候,他是知道他要做什么事的。但是这个事儿呢,他不想自己做,他想交给其他的线程做,

让自己做更重要的事情,对吧?但遇到的一个困难是,执行线程不知道发送线程,它要执行怎样的逻辑?那最好的方法就是让发送线程,把要执行的逻辑写好之后呢,把这个任务交给执行线程,那执行线程 只要按照发送线程的要求。去执行任务就OK了。

这就像我们日常中的管理一样,那对于一个项目管理者来说,你想让你底下的开发人员去帮你完成一个大的项目。由于你对这个项目特别熟悉,所以呢,

你应该把这个项目怎么做?做哪些功能告诉开发人员,这样开发人员按照你的要求把这个代码编写出来就了,对吧?那这也是我们工作中经常采用的一种工作方式,

那实际上在我们的开发项目中啊,你会发现很多的系统的管理都是我们日常生活中的工作方式。只不过说你把日常中的工作方式转换成了代码,让计算机去做这一系列的事,也就是说计算机模拟了我们日常的工作。

那了解了这些内容之后呢?咱们现在切换到Windows系统下来看一下外拔tc的代码是如何实现的?我们把程序运行起来,依然是以peer connection clan的。这个项目为起点,

这样呢,一步一步进入到y八七c的底层。来找到我们创建线程执行线程的地方。好,我们先连接新的服务器,选择我们要连接的对象。这时候呢,首先会创建peer connection factory,对吧?这个在我们之前都介绍过。之后呢,在peer connection factory内部跳到三大线程的创建。网络线程工作线程限定线程对吧?那在这里呢,我们不需要看过多的内容,
在这里插入图片描述
owned_network_thread = rtc::Thread::CreateWitthSocketServer只是创建了一个对象,具体创建什么线程以及线程与对象的绑定都是在start的时候做的

我们只要关注。代码的91行的这个函数,看它内部是如何实现的就了好,我们单步执行。现在呢,跳入到这个函数中OK,这样呢,我们就进入到了的这个函数中,我们来详细看一下,在这个函数中具体做了哪些事情?125行呢,它首先判断现在这个线程是否已经运行了,对吧?如果运行了,我们现在这个逻辑呢,
在这里插入图片描述

就没必要再做了。直接退出就OK了,那显然现在是没有运行的。好,那紧接着呢,它调用了一个restart,这个restart的含义呢,就是将线程的状态机重新复位。那感兴趣的同学呢?可以再跳到这个函数中去看一下具体的事件,这里呢?我们就不详细跟踪了,好,我们继续往下执行。再接下来,

它是创建了一个three的manager实例,对吧?那在这里之所以要执行这条语句呢,是为了确保。street manager已经创建成功了,那在这里的注释呢?也说的非常明显。确保我们在创建一个新线程之前呢?在主线程已经创建了thread manager这个对象。OK,那我们继续走啊。到737行,那这个时候呢,我们就看到了一个非常熟悉的函数,就是create three的。

那通过这个函数呢,我们就将一个线程创建出来了,线程创建成功之后呢,它就会执行这个方法。那下面呢,我们就跳到pre ran,然后来看看在pre ran中做了哪些事情,我们在这里打个断点啊。那当断点来到824行的时候。实际我们的新线程就已经创建成功了,对吧?因为它已经执行到pre ran这个函数中了OK,那下面呢?我们来单步执行一下。在这个函数中呢,
在这里插入图片描述

首先它将传入的参数恢复成。three的对象。之后呢,调用thread manager中的set current three的方法将这个线程呢设置到thread m anager中。那这里啊,我们大家要注意,就是我们创建好的three的对象,什么时候与我们的线程进行绑定的呢?一定是在这个线程已经启动之后才进行绑定的,对吧?这里呢,就是这种情况,就是当我们的线程运行起来,执行了pre ran之后。它才能将当前线程与我们之前创建好的的对象进行绑定,

对吧?其中825行就是做这件事儿了,绝对不可能是我们线程没有创建的。就进行线程的绑定,这是不可能的,这就成了无米之炊了,对吧?OK,那我们再继续往下走,再下来呢,是给这个线程设置一个名字,我们就不看了,之后呢,将three的对象赋值给当前的任务队列。因为本身three的就是一个队列。
在这里插入图片描述

所以就是让我们当前的这个任务队列呢,指向three的也可以这么理解,那执行到831行之后呢,我们就看到。当前线程呢,又拐了一个弯到three的对象的run方法中去执行,我们再跳到这个run方法中。在run方法中呢,它只调用了一个函数,就是process message对吧?我们继续跳进去。那在process message中做了什么事情呢?这块的逻辑啊,就非常简单了,在993行,
在这里插入图片描述

我们就看到了这个while循环。那在这个死循环中,他做了什么事呢?非常简单,首先通过get从消息队列中获取一个消息。之后要用dispatch来处理这个消息,在dispatch中呢,它写了一堆逻辑对吧?但核心的逻辑。就是664行。
在这里插入图片描述

也就是调用p message中的handler对象的on message方法。来对这个消息呢进行处理,具体之中的逻辑只有发送线程才知道,如果我们想知道之中具体做了哪件事儿?(on->message是发送线程的函数,具体要看发送线程怎么搞)

我们就要找发送线程,在构造这个消息的时候。它里边儿的on message具体是如何实验的,我们才能知道里边儿的逻辑是什么,对吧?通过这样一个分析啊,我们可以知道,对于y八七c来说。它各县城的职责其实是非常明确的,每个县城有每个县城要做的事情,每个县城有每个县城的责任。

工作线程我只负责做事儿,对吧?

那信令线程呢?我要与应用层进行交互。

网络线程呢?我负责网络包的收发,这样就使得各线程的工作效率非常的高效。

但同时,它也带来一个问题,就是我们在阅读它代码的时候。就非常的困难,因为当我们进入到工作线程去看它的逻辑的时候,你会发现里边没有什么具体的业务逻辑。

真正的逻辑是在哪儿呢?是在发送线程,有可能是限令线程,有可能是网络线程,他们才知道具体要干什么活儿。

而对于工作线程来说呢,他只是埋头干活儿的人,并不知道具体逻辑是什么,别人让我怎么做,我就怎么做。那这就打破了我们人类思维,从上到下的一个惯性,它实际要跳着来。也就是说,如果我们想知道具体要做哪些事情的时候,你要找到它的根源才能清楚这件事儿到底在做什么,为什么要这样做?

而对于干活的县城来说呢,它是一问三不知。所以这也是我们为什么学习web rtc有这么多困难的一个非常关键的原因,(最主要的一点其实是讲了webrtc的工作线程只是调用了发送线程的接口而已)

好,那通过这节课呢,我们就知道了web rtc的线程是如何创建出来的,以及在线程内部,它是如何运行的。

同时,我们也知道了,我们要想弄清楚各线程之间的逻辑,必须从发送线程着手,而不能从工作线程着手。这样才不至于我们在庞大的代码里迷失方向,

那以上呢,就是我们这节课所介绍内容有任何的问题呢,你可以到讨论区或者是群里去给我留言。我在那里呢,给你做相应解答好,谢谢。

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

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

相关文章

Redis分布式缓存

分布式缓存 -- 基于Redis集群解决单机Redis存在的问题 单机的Redis存在四大问题: 1.Redis持久化 Redis有两种持久化方案: RDB持久化 AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file(Redis数据备份文件)&#x…

Certify The Web (IIS)

一、简介 Certify The Web 适用于 Windows的SSL 证书管理器用户界面,与所有 ACME v2 CA 兼容,为您的 IIS/Windows 服务器轻松地安装和自动更新来自 Letencrypt.org 和其他 ACME 证书授权机构的免费 SSL/TLS 证书,设置 https 从未如此简单。 …

JSON的处理

1、JSON JSON(JavaScript Object Notation):是一种轻量级的数据交换格式。 它是基于 ECMAScript 规范的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#…

[PyTorch][chapter 49][创建自己的数据集 1]

前言: 后面几章主要利用DataSet 创建自己的数据集,实现建模, 训练,迁移等功能。 目录: pokemon 数据集深度学习工程步骤 一 pokemon 数据集介绍 1.1 pokemon: 数据集地址: 百度网盘路径: https://pan.baidu.com/s/1…

二、8.系统调用、可变参数和堆内存管理

系统调用:让用户进程申请操作系统的帮助 一个系统功能调用分为两部分, 一部分是暴露给用户进程的接口函数,它属于用户空间,此部分只是用户进程使用系统调用的途径,只负责发需求。另一部分是与之对应的内核具体实现&am…

C++day1(笔记整理)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.第一个c程序&#xff1a;hello world #include <iostream> //#:预处理标识符 //<iostream>:输入输出流类所在的头文件 //istream:输入流类 //ostream:输出流类using namespace std; //std&#x…

Goland 注释时自动在注释符号后添加空格

不得不说 JetBrains 旗下的 IDE 都好用&#xff0c;而且对于注释这块&#xff0c;使用 Ctrl / 进行注释的时候&#xff0c;大多会在每个注释符号后统一添加一个空格&#xff0c;比如 PyCharm 和 RubeMine 等。 # PyCharm # print("hello world") # RubyMine # req…

从Web 2.0到Web 3.0,互联网有哪些变革?

文章目录 Web 2.0时代&#xff1a;用户参与和社交互动Web 3.0时代&#xff1a;语义化和智能化影响和展望 &#x1f389;欢迎来到Java学习路线专栏~从Web 2.0到Web 3.0&#xff0c;互联网有哪些变革&#xff1f; ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#x…

易思智能物流无人值守系统文件上传漏洞复现

0x01 产品简介 易思无人值守智能物流系统是一款集成了人工智能、机器人技术和物联网技术的创新产品。它能够自主完成货物存储、检索、分拣、装载以及配送等物流作业&#xff0c;帮助企业实现无人值守的智能物流运营&#xff0c;提高效率、降低成本&#xff0c;为现代物流行业带…

Unity 物体固定屏幕尺寸(透视模式)

物体固定屏幕尺寸 &#x1f96a;效果图&#x1f371;食用方法 &#x1f96a;效果图 如图所示物体远离摄像机后会被放大&#xff0c;靠近相机会被缩小&#xff0c;使得在屏幕上的大小保持不变&#xff1b; &#x1f371;食用方法 导入插件后使用gameObject.SetFixedScreenSi…

python 开发环境(PyCharm)搭建指南

Python 的下载并安装 参考&#xff1a;Python基础教程——搭建Python编程环境 下载 Python Python 下载地址&#xff1a;官网 &#xff08;1&#xff09;点击【Downloads】>>>点击【Windows】>>>点击【Python 3.x.x】下载最新版 Python&#xff1b; Pyt…

前端(十三)——JavaScript 闭包的奥秘与高级用法探索

&#x1f636;博主&#xff1a;小猫娃来啦 &#x1f636;文章核心&#xff1a;深入理解 JavaScript 中的闭包 文章目录 不理解闭包&#xff1f;这玩意很难&#xff1f;闭包的定义与原理闭包是什么创建一个闭包 闭包的应用场景闭包与作用域闭包与作用域之间的关系全局作用域、函…

Python爬虫实战案例——第一例

X卢小说登录(包括验证码处理) 地址&#xff1a;aHR0cHM6Ly91LmZhbG9vLmNvbS9yZWdpc3QvbG9naW4uYXNweA 打开页面直接进行分析 任意输入用户名密码及验证码之后可以看到抓到的包中传输的数据明显需要的是txtPwd进行加密分析。按ctrlshiftf进行搜索。 定位来到源代码中断点进行调…

ES6 代理

一、代理 Proxy 用于修改某些操作的默认行为&#xff0c;等同于在语言层面做出修改&#xff0c;所以属于一种“元编程”&#xff08;meta programming&#xff09;&#xff0c;即对编程语言进行编程。 Proxy 可以理解成&#xff0c;在目标对象之前架设一层“拦截”&#xff0…

git协议实现管理(三个步骤)

GitHub官网访问&#xff1a; https://github.com/dashboard 初次使用git的用户要使用git协议大概需要三个步骤: 一、生成密钥对 二、设置远程仓库(本文以github为例)上的公钥 三、把git的remote url远程仓库URL可访问路径修改为git协议(以上两个步骤初次设置过以后&#xff0c…

面试之HTTP

1.HTTP与HTTPS的区别 HTTP运行在TCP之上&#xff1b;HTTPS是运行在SSL之上&#xff0c;SSL运行在TCP之上两者使用的端口不同&#xff1a;HTTP使用的是80端口&#xff0c;HTTPS使用的是443端口安全性不同&#xff1a;HTTP没有加密&#xff0c;安全性较差&#xff1b;HTTPS有加密…

python刷小红书流量(小眼睛笔记访问量),metrics_report接口,原理及代码,以及x-s签名验证2023-08-21

一、什么是小眼睛笔记访问量 如下图所示&#xff0c;为笔记访问量。 二、小眼睛笔记访问量接口 1、url https://edith.xiaohongshu.com/api/sns/web/v1/note/metrics_report 2、payload data{"note_id": note_id,"note_type": note_type,"report_t…

爬虫逆向实战(十九)--某号站登录

一、数据接口分析 主页地址&#xff1a;某号站 1、抓包 通过抓包可以发现登录接口 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个jsondata_rsa的加密参数 请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 无cookie是否…

【报错】yarn --version Unrecognized option: --version Error...

文章目录 问题分析解决问题 在使用 npm install -g yarn 全局安装 yarn 后,查看yarn 的版本号,报错如下 PS D:\global-data-display> yarn --version Unrecognized option: --version Error: Could

数据结构---串(赋值,求子串,比较,定位)

目录 一.初始化 顺序表中串的存储 串的链式存储 二.赋值操作&#xff1a;将str赋值给S 链式表 顺序表 三.复制操作&#xff1a;将chars复制到str中 链式表 顺序表 四.判空操作 链式表 顺序表 五.清空操作 六.串联结 链式表 顺序表 七.求子串 链式表 顺序表…