首先抛出问题:
1.GIL锁和线程互斥锁在整个程序中有何屌用?锁的是什么?
2.多线程究竟是如果竞争offer?操作系统-解释器-执行多线程的流程?
直接贴图(个人理解+参考绘制,如有问题,请指正 ^)
解释:
T1():
1.线程1和线程2分别读取共享数据池变量a的指针
2.T1竞争到GIl锁,cpython解释器保存锁状态(T1占用)
3.T1交给操作系统,OS调用原生线程,将T1交给 CPU1
4.CPU1(每一步都是一条CPU指令)
4.1 读取a指针加载全局变量 0
4.2 加载常量1
4.3 完成 0+1 运算
!!! OS分配给T1的时间片到
5.T1无奈返回解释器,释放GIL锁,解释器保存锁状态(无占用)
6.解释器保存T1运行状态,T1等待下次调用
T2():
7.T2获得GIl锁,解释器保存锁状态(T2占用)
8.T2交给操作系统,OS调用原生线程,将T2交给 CPU4
9.CPU4
9.1 读取a指针(此时T1未运行完,a处于locked状态)
9.2 阻塞.....等待时间片到
10.T2无奈返回解释器,释放GIL锁,解释器保存锁状态(无占用)
T1(2):
11.T1竞争到GIl锁,读取上次运行状态,解释器保存锁状态(T1占用)
12.T1交给操作系统,OS调用原生线程,将T1交给 CPU1
13.CPU1
## 接着上次运行状态
4.4 将计算结果返赋值给 指针a (此时全局变量a已改变)
4.5 等待时间片....
4.6 OS分配给T1的时间片到
14.T1返回解释器,释放线程互斥锁,并结束线程
15.T1释放GIL锁,解释器保存锁状态(无占用)
T2(2):
16.T2获得GIl锁,解释器保存锁状态(T2占用)
17.T2交给操作系统,OS调用原生线程,将T2交给 CPU4
18.CPU4
## 接着上次运行状态
9.3 读取a指针加载全局变量 1
9.4 加载常量1
9.5 完成 1+1 运算
9.6 时间片
未到 :将结果返回给全局变量a
到了 : 返回解释器交出GIL等待下次调用
19.T2返回解释器,结束线程2,解释器保存锁状态(无占用)[T2在时间片之内完成运算并且成功返回值]
纯属个人理解,转载标注,Thanks ^.*