三大通识知识:进程,线程,网络(三)
三大通识知识:进程,线程,网络(一)
三大通识知识:进程,线程,网络(二)
前言
上一节课,我们介绍了进程的代码实现原理,讲到了子进程是如何产生的,进程的空间为什么是独立的,进程为什么可以裂变…,现在我们要过渡到线程了,我们在第一篇博客《三大通识知识:进程,线程,网络(一)》中讲到,因为进程太占用资源,所有发明了线程,解决了进程的缺陷,有人就有疑问了,那为什么要进程呢,进程没有优点吗?
进程存在的意义
操作系统是通过进程来管理所有程序的,其实我们任何一个程序,在电脑上运行起来后,至少有一个进程,很多时候你不知道而已,因为你没有去关注它,也因为你用不上这些东西,就像你从生下来,这个世界就在这里了,你不用去问我从哪里来,要去哪里。(娘肚子里来,去坟墓里——狭义相对论,????)。
其实,线程也是这样,你不能独立存在,必须是在进程之上!
所以说,进程的意义是什么?如果说操作系统是这个世界的话,那么进程是你的家!
好了,就这么理解吧,我觉得很好!
线程是如何让两个while 1运行的
我们在第一篇博客中,讲线程与进程的关系的时候,大家看到过这个图,也许很多人没有理解,因为没有实例代码,还是很抽象,但是我在讲关系的时候,必须这样讲,大体关系理清楚后,我们在看细节——代码级别的实现原理。
进程如何让两个while 1同时运行,在《三大通识知识:进程,线程,网络(二)》我已经分析清楚了,我对自己的分析还是很满意的,否则我不会写出来。
那线程是如何让两个while 1同时运行的呢?我们直接看代码实例!
上面的程序,主线程(main所在线程)有一个while 1,负责打印点,子线程(thread_fun)中也有一个while 1,负责打印星号。
从有图的运行结果中,我们也确实看到在屏幕上在交替打印,说明两个while 1在同时运行了。
这其中的关键函数就是pthread_create了,是它创建了子线程thread_fun,其实子线程就是一个函数。
我们这里,先不讨论pthread_create函数具体细节,我们来看如何创建多个线程呢?
比如,我要实现创建三个线程,线程一负责打印字符"a",线程二负责打印字符“b”,线程三负责打印字符“c”,这样一个功能如何实现呢?
请看大屏幕????
就这么简单,我们在主线程里面通过pthread_create创建三个子线程,pthread_create函数执行完成,子线程就开始运行了,我们看到左边的运行结果,一共有四个线程(加上主线程)分别在屏幕上打印点abc。
神奇的是,如果几个线程所做事情相同,那么可以共用一个函数,我们改进一下代码:
我们在使用pthread_create函数创建子线程的时候,创建第一个线程传进去的参数是字符“a”,创建第二个线程,传进去的是字符“b”,创建第三个线程的时候,传进去的是字符“c”。这里,有一个直到思考的问题是,三个线程共用一个函数thread_fun,但这里要理解,这是三个线程,他们共享同一份代码,但是执行的参数不一样,你可以想象有三条线在执行。右边,可以看到四个程序在交替执行。
这里面涉及到指针的理解,这也许是很多初学者最难以理解的地方,想进一步学生的同学可以看我的视频
https://edu.****.net/course/play/9949/211713?spm=1002.2001.3001.4143(非免费)
线程的意义
线程最大的作用是可以协同完成一件事情,我们上面三个线程,只是做一个简单的打印动作,其实你可以想象做任何其他复杂的事情,而我们要做的就是如何让这些线程不乱跑,在我们的控制之下,比如永远让他们按照abc,abc,abc进行,而不是我们现在看到的,有时候是cba,有时候是bca。
好了,线程真正的意义体现在网络服务器中,等到下一篇再研究吧!
END
希望本文对您有帮助,如果有用就收藏吧!当然欢迎你购买我的视频进一步学习!
三大通识知识:进程,线程,网络(一)
三大通识知识:进程,线程,网络(二)