ftp上传网站教程,网站制作 企业网站建设哪家好,wordpress导入xml空白,辽宁省建设工程执业信息网今天呢#xff0c;我们来介绍一下线程的管理与绑定#xff0c;首先我们来看一下web rtc中的线程管理类#xff0c;也就是thread manager。对于这个类来说呢#xff0c;其实实现非常简单#xff0c;对吧#xff1f;
包括了几个重要的成员#xff0c;第一个成员呢就是ins…今天呢我们来介绍一下线程的管理与绑定首先我们来看一下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。它是如何管理线程的线程与对象之间是如何绑定的就非常清楚了那后边呢我们再看后续的代码的时候。就非常容易了好那今天呢我们的课就到这里有任何的问题呢你可以到讨论区或者是群里去给我留言我在那里呢给你做相应的解答好谢谢。
回播放处