00:00
刚才呢,我们啊,对。好。刚才呢,我们给大家讲解了对不对,讲解了这个管道的这么一个引出问题。而且呢,我们也用了全局变量加锁来解决,但是呢,它不够完美,不够完美,所以说人家在这地方呢,也写的非常的经经典啊,这句话说的也很经典的,他说这是一个低水平的啊,低水平的。呃,刚才一个互斥锁嘛,这加了一个东西是吧。啊,护士锁加了护士锁来解决的,那现在呢,我们来进一步进一步来研究这个问题。对,为什么需要这个穿入管道来解决这个不同的携程之间的一种通讯呢?我总结了这么几句话,大家来看看有没有道理啊。前面使用的全局变量加速同步来解决GR的通讯可以,但不完美对吧?不完美主要体现在哪里?第一点,主线程在等待所有歌全部完成的时间很难确定。
01:10
这里我们设置了十秒,仅仅是估算而已,如果你不设置,大家都知道你不设置,其实一个结果都没有,大家看啊,再体验一下,就是说如果我们这没有设这个休眠时间,其实你在便利的时候,你什么都拿不到。因为它它瞬间就飘过去了,这个是因为这个time。没有用,所以说你看如果我没有休眠时间,你加C锁没有任何意义,加了和不加没什么用,直接你看一直行啪一跑。啊对,这个没有没有编译啊,没有编译,再编一下编一下。你看这是我我我编译了,编译过后我来执行一下,刚才这个你看。是不是也也有啊。也有。但是。他不全,而且我们这个只只有20个数据,为什么不全,就是因为你这个他他也跑了,但是因为你这没有等他H的一下就跑过来是吧,所以说你相当于说呃,也执行了一点,但是呢,执行到第十个时候就没了。
02:11
因为你没有等待嘛,所以这肯定这个程序是错的,相当于因因为你没放那么多,人家20个呢,你才是十个。假假设过30个呢,对不对,所以说这个呢,肯定是不行的,那么时间设置了十秒太长了,太短了也不好设置,如果主线主线程休眠时间长了,会加会加长等待时间,如果设置的短了呢,可能还会使GR处于工作状态,这样也会随主线程退出而销毁,就是你还没工作完毕就跑。好,第三个呢,通过全局变量加锁加锁同步来实现这个通讯,也并不利于多线程对全局变量的读写操作。啊,有时候你不知道在哪处理,你看刚才同学们也看到了,虽然我们用这个加锁解决了,我们在这加了,你还得分析出来要在这加。
03:03
如果哪些地方你少加一个都会出问题,你还不好分析,你还不好分析,所以说第四个种种原因呢,我们就需要一种新的这么一个机制叫channel,好,这是为什么需要channel,我们把它引出来了,来把它放到这,有了这个东西呢,下面呢,我们自然就进入到。怎么去用这个channel来解决问题,好,刚才讲的第一点。第一点就是说不够完美。第二点对吧,主线程设计的时间不好估算,第三个全局变量实现同步呢,并不利于多线程对全局的读,全局变量读写啊,第四个呢,就是我们要新的一一个机制。好,有了这个原因过后呢,我们就来看这个channel的具体使用,看一下子上介绍,首先我们开篇名意给同学们说出第一句话,Channel及管道的本质就是一种数据结构及队列,那么我们很多同学呢,学过数据结构,有些同学呢没有学过这个数据结构,那我这里不管你学过没学构,我简单说一下,队列是什么玩意儿,它有什么特点啊,简单了了一下,因为你要彻底明白这个channel,你必须要对队列有一定的了解,有一定的了解各位朋友,那么画一个示意图。
04:18
对待是个什么玩意儿呢?你可以这样理解,你也可以这样理解,好,我们还是把这个拿过来啊,我们还是把这个拿过来。那么我待会儿呢,这样子做。好,我把这个直接放到这个位置来。好,这是我的携程,我这有可能有很多携程啊,那至至于有多少个我们不去管,那这里呢,有一个数据结构。这里有个数据结构,各位同学请看,我姑且把它称之为一个管道。哦。长得像不像管道我们不管啊,就是个管道。管道呢,你要这么去理解。这儿有一个channel。啊C,这是我们管道,管道听这个名字还是比较形象的,管道嘛,同学们肯定小时候都都都知道管道是么样,长得像个管子一样,那它什么结构呢?它像一个,它像一个队列一样,就跟排队,怎么排队呢?各位朋友,那假设这里面有一个数据,这个数据呢,我用一个小圆圈表示它这样子的啊郭同学。
05:23
那这个管道本身它它也是有大小的啊,也有大小也有容量,那第一个数据呢,假设我们有个数据来了,诶加进去。假设我这有好几个数据啊,同学们。我这有四个数据,注意听哈,你不然的话,待会你你不好理解知道吧,东西并不难,但是你理解起来不一定到位,比如说这是第一个数据,有一个十。好,放在这里有有个一吧。好,这有个数据二。这有个数据假,假设是个整数二,这有一个数据假设是五,这有一个数据假设是八。啊,那么这个这个管道会怎么样呢?当你向这个管道里面放东西的时候,它就把这个新的数据扔在这个,按顺序这个排队存放。
06:11
这是二,那么这是第五再放一个数据呢,他排在最后面再放一个数据呢,它放到这一方,所以说他好像排队一下,就是大家对排队买票票是吧,然后再出这个从这个管道读的时候怎么读呢,各位同学。他这样读,把这个第一个读出来。你第一个读出来过后呢,这个长度就变小了啊,待会你会发现一些非常奇怪的现象,一旦这个读出来,它的长度就变三了。但是容量没有变化,容量还这么大,于是这个呢,就顶到前面去了。它会相当于说他会排到第一去,紧接着呢,你又假设要再取的话,就取的是第二个。好,如果再取一个呢,它会往前面移动啊,它会有一个移动的过程,它一旦移动这个长度也变成了二,同样再取的话,就把这个取出来了,再取的话,这个三号呢,往前面移动,再取就到这来了,如果再取就报错了,如果你没有任何机制,你你就傻不愣登的取,直接给你报错啊,他直接告诉你这个是一个date knock,除非你有别的机制,好所以说简单这个流程呢,就这样子的,那数这个,所以说它的本质呢,就是一个队列。
07:24
这个队列我们后面会教大家写,队列的实现方式很多,可以用链表来实现队列,也可以用简单的,像我们数组啊切片也可以实现这种队列,那队列就是这样一种数据结构啊,这样数据结构好,大家明白这个队列的大致的这个用用处了,过后呢,同学们,那么我们就讲起这个,讲这个管道呢,就比较怎么样轻松一点了啊这这个示意图大家有有个基本认识啊,好大家知道它在取的时候一定是取最前面的,取完了过后这个长度呢会减少,就你取一个长度就减少一个,再取一个长度又减少一个,再取一个,最后长度为零,再取的时候就报错了。
08:03
啊,除非你本身有个机制,比如你说这个关闭了管道怎么样啊,它会有机制的,好它的基本操作示意图我们就先说到这里,接着再往下面看。数据的,这个数据是先进先出,它有个专业的术语叫first in first out,就是Fi。这个呢,如果你看到这个词的话,就是这个代表first in first out,翻译成英文是这样写的啊。找first in。First in first out啊,就是先进先出,跟那个站刚好反过来了,那个站是先进后出啊,所以说这个大家要明白这个fio的含义,做一个程序员必须了解第三点,线程安全,这是它最牛逼的地方啊。这个说之所以用管道,各位同学之所以用管道,就是管道它本身是线,是这个线程安全的。
09:01
什么意思呢?就是说你在用这个管道的时候,你在对管道读取的时候,我不管你有多少个斜程在对同一个管道操作,不管是读和写,各位同学你放心大胆直接用,绝对不出毛病啊,绝对不出毛病,这一点是由它的编译器在底层给你维护的,因此呢,大家看当多个固体访问时无需加锁,这说明channel本身就是线程安全的,这一点特别好,也就是说什么意思?各位同学,假如后面我们这有。100个,哪怕你有1000个,1万个,我不管你去操作OK。你去操作我这个玩意儿,OK,你也来操作我这个玩意儿,好的好,你也来操作,包括你也来操作,好你们都来操作吧,我的朋友啊,他说欢迎操作啊,你怎么操作,告诉大家,他始终是能够维护这个管道的线程安全。
10:00
因为它本身是有机制,至于他的这个机制是什么样子的呢?大家可以去看一下代码啊,其实他这边也是要有这个锁的机制在里面维护的,那不管怎么样,只是说这个东西呢,他底层的一个高手,咱们写的这个代码肯定是比较漂亮的,对吧?他比较漂亮的咱们有兴趣可以到时间有机会我们去看一下这源代码,现在想把它基本尝试弄懂了再说啊,讲数据结构的时候,咱们有机会把它打开看一看就行了,好,他是这样去操作,所以说你放心大胆,线程安全,这是它的。让我们非常高兴的一件事情就是参。CHANNEL4。是管道安全的。广东安全,那就是县城安全的,线程安全的就是多个安全。安全多个多个携程,多个携程。携程操作时。其实操作。操作同一个。操作。操作同一个同一个。
11:02
同一个同一个这个管道室,管道室不会发生啊,不会。不会发生什么呢,资源竞争问题。好,这个所以说请大家放心,它不会发生这个这个资源竞争问题,是放心大胆的用啊,这是它的第三个特点,第四一个,那这个管道呢,它还有一个特别明显的特点,它是本身是有类型的,比如说这个管道里面能放什么数据,你可以指定这个类型,比如说你说你这个管道类型是十寸,那你只能放十寸。如果你这个管道是这个int,那你只能放int,那当然有同学说老师麻烦了,假设我这个管道又想放int,还想放float怎么办呢?那你把这个管道生命成interface,空接口也可以,它也可以接受,这个事情明白我意思吧,但一般来讲呢,咱们最好不要去混庸,没有特殊情况下不要混用,因为你取的时候呢,你还用,还得用类型断盐才能取啊,也也很麻烦,好所以说呢,这个地方一定要明白,我们的这个管道它是有类型的,有类型好关于China的一个基本就说完了,下面呢,我们就来看它的具体用法,好China的一个基本介绍。
12:17
China的China的一个基本介绍对不对。好,来两个,来两个,一个是基本介绍。好,基本介绍呢,刚才我们讲了两点,对,第一个为什么要用,要用这个这个channel。好,这个地方就嗯这写到这啊China的哦,刚才已经讲了,China已经为什么要用,咱们已经说过了。好,这是基本介绍,那基本介绍呢,我这大概总结了这么四句话吧,也还是比较重要的四句话,我把它放到这里来,给他简单的给各位同学进行一个板书。第一个。对吧,这是第二个没问题,第三个好,那么这个China的它的一个示意图呢,我也给同学们写到这个示意图,示意图那他长什么样子,你得有一个形,比较形象的一个认识,在哪里呢?在这里。
13:13
哎,在这里我把它拿过来,各位朋友。我总结了这么几点啊,各位同学在这里可以看到它是有一个线程安全问题,好的,我把它阐述到这里,基本介绍就说到这儿,下面呢,我们再看它的一些使用。
我来说两句