多线程运行原理分析(GiL锁+线程互斥锁)

首先抛出问题:

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 ^.*

猜你喜欢

转载自www.cnblogs.com/zhangRT312/p/12505576.html