Gil和线程安全

来源:3-5 Python性能剖析与优化,GIL常考题

思君满月

2019-03-19

老师没讲明白一个问题,为什么走了gil,还不能保证现成安全,还得自己加锁,那要他何用?

写回答

1回答

PegasusWang

2019-03-19

GIL 保证了同时间最多只能有一个线程执行字节码,它保证的是字节码层面的线程安全。但是多字节码操作无法保证对数据结构的访问是安全的。

我给举个例子。对于 a += 1,可以认为它有三步骤。分别是获取 a 的值,自增操作,最后保存回 a 变量。这个操作需要多个字节码操作,不是原子操作。(python 很多内置数据结构的操作都是原子的,比如直接赋值,这些是线程安全的)

  1. load a

  2. incr a 

  3. save a



假设 a=0,现在有两个线程A,B 在 执行,执行一个线程(A)的过程中有可能切换到另一个线程(B),时序图如下:

//img.mukewang.com/szimg/5c910f56000122e026141458.jpg

    

这张图基本就说明了问题,不知道看懂了咩?这里 期望的是2个线程应该是自增了两次,结果是2,但是这种情况下小概率会发生就是结果还是1.

如果 你给整个步骤加了锁,执行的时候整个操作不会切换,也就不会出现这种问题。


还有个参考可以看看,虽然感觉没人回答的比较直白:

https://www.zhihu.com/question/23030421

5
4
慕后端4419857
老师GIL是在第几节课里讲的啊?
2021-02-17
共4条回复

Python工程师面试宝典 一线大厂资深面试官亲授

Python工程师面试必看,资深面试官亲授,倍增面试成功率

1035 学习 · 102 问题

查看课程