- 多线程的背景以及为什么用多线程
线程事基本的调度单位,一个线程只能在一个cpu上跑,而一个cpu在某一个时刻也只能跑一个线程。由于线程在cpu上跑的时候,如果是进行一些不需要cpu参与的操作,例如是磁盘的io,或者是网络上的io的时候。由于不需要cpu的参与,如果是一个进程只有一个线程,也就是单线程的话,那么整个进程就会被阻塞(相当于卡顿)。**然而,在一个进程能开启多个线程—也就是进行并发,当cpu在处理某个线程的时候遇到磁盘io或者是网络上的io时,就可以被操作系统切出cpu,,让其他线程去执行。。**举个例子,,我们做饭相当于一个进程(一个启动了 的程序叫进程),我们有很多工作,例如是洗碗,淘米,等待电饭锅的米饭熟。。如果我们是使用单线程的话,那么我们只能一步步来,在等待电饭锅的米饭熟的时候(其实这一步本应该不用人参与,,就像是不需要cpu参与一样)。但是在单线程的时候我们只能空空的等待,,等待到米饭熟了的话,才能去洗碗。倘若我们使用多线程,可以在等待米饭熟的过程中洗碗。。如果是多个cpu的话,还能在执行淘米的时候,洗碗。。因为多个cpu存在,相当于多了个人。
- 多线程的坏处上面间接表明了多线程的快速,但是呢!!!
内存花销大
当一个进程开启了多线程,就相当于将一件事情分成了多个可以分离的步骤,需要更多是内存去存储每一个线程的状态,相当于要记录没意见事情的完成情况。
线程切换上下文的花销大
当你淘米淘到一半,cpu分配你该做洗碗了。那么你就要去洗碗,你得先记录你淘了多少次米,等洗完碗再回来。万一你洗碗洗到一半,手上全部都是洗洁精,那么你就要洗完手再去淘米。这种就是运行态的线程挂起以及挂起的线恢复到运行态的上下文切换消耗。正在运行的线程存储在操作系统的内核态中,属于非用户的线程。
线程之间的信息共享问题,也就是线程的数据是否安全的问题。(线程数据安全性问题)
当两个线程对共享变量进行访问时,有可能造成一些数据的不能同步,看你A线程对变量进行了修改,然而B线程并不知道,读取了旧的属性。例如,淘米需要淘3次,当线程a读取时显示的是0次,然后线程a就去淘米。在线程a淘米的过程中,线程b进行了淘米次数的属性读取,还是0次&#x