1.线程的生命周期
1.1.新建:创建线程
1.2.就绪:等待调度
1.3.运行:调度成功
1.4.阻塞:暂停运行
1.5.消亡:执行完毕或者异常终止
可能有三种情况从运行到阻塞:
- 同步:线程获取同步锁,但是资源已经被其他线程锁定,会进入阻塞.
- 睡眠:线程运行sleep或者join线程.
- 等待:线程执行wait方法,等待其他线程notif
2.多线程是共享全局变量
在一个进程内的所有线程共享全局变量
但是,线程对全局变量随意修改可能会造成多线程之间全局变量的混乱
3.同步和互斥
在多任务操作系统中,同时运行多任务可能:
- 都需要使用同一个资源
- 多个任务之间有依赖关系,某个任务的运行依赖于另一个任务
3.1互斥:一个公共资源同一时刻只能被一个进程或者线程使用,多任务不能同时使用
3.2同步:多个任务的运行必须严格按照某种先后次序运行
同步是一种更为复杂的互斥,而互斥是一种特殊的同步,也就是说同步和互斥都是不能同时运行线程.
4.互斥锁
当多个线程几乎同时修改某一个共享数据时,需要进行同步控制.线程同步能够保证线程安全访问竞争资源,最简单的同步机制就是引入互斥锁.
互斥锁为资源引入一个状态:锁定/非锁定
- 某个线程想要更改共享数据时,先将其锁定,此时资源的状态为”锁定”,其他的线程不能修改
- 直到线程使用完资源,将资源的状态修改为”非锁定”,其他的线程才能再次锁定这个资源
5.死锁
如果多个公共资源,在线程共享多个资源的时候,两个线程分别占有一部分资源并且同时等待对方的资源,就会引起死锁
6.协程
微线程,是python中另一种实现多任务的方式,只不过比线程占用更小的执行单元(资源).
协程自带cpu上下文,这样就能在合适的时机,从一个协程切换到另一个协程,只要这个过程中保存或回复cpu上下文那么程序就可以运行.
多任务操作系统,支持远大于cpu数量的任务同时运行.这些任务实际上并不是真的在同时运行,而是在很短的时间内,操作系统将cpu轮流分配给他们,造成同时运行的错觉.
在每个任务运行前,cpu需要知道任务从哪里开始运行,又是从哪里开始加载,也就是说,需要事先设置好cpu寄存器和程序计数器.这些都是cpu在运行任务之前必须依赖的环境,称之为cpu上下文.
cpu寄存器是cpu内置的容量小速度快的内存