请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Gil和线程安全

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

正在回答 回答被采纳积分+3

1回答

PegasusWang 2019-03-19 23:50:40

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

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

  1. load a

  2. incr a 

  3. save a



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

//img1.sycdn.imooc.com//szimg/5c910f56000122e026141458.jpg

    

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

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


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

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

5 回复 有任何疑惑可以回复我~
  • 提问者 思君满月 #1
    老师,我感觉我钻进了死胡同,久久不能自拔。我迷惑的点是:字节码的原子性跟GIL有没有关系,如果字节码本来就是原子操作,那GIL显然就没有意义了。后面百度发现“CPU指令”是原子操作,突然意识到CPU指令跟Python的字节码指令不在一个维度。所以我做了下面的假设:CPU指令具有原子性的,这是操作系统保障的,而Python的字节码指令并不等价于CPU指令(一个字节码可能有多个CPU指令构成),不具有原子性。所以GIL就是保证字节码的原子性。如果我的理解是对的,那我就明白了,如果不对,还请老师指点一下。
    回复 有任何疑惑可以回复我~ 2019-03-23 06:54:53
  • PegasusWang 回复 提问者 思君满月 #2
    可以这么认为,没大毛病。一个字节码操作对应多个汇编指令
    回复 有任何疑惑可以回复我~ 2019-03-23 16:35:22
  • 木下无月 回复 提问者 思君满月 #3
    感谢 你这么说一下我也理解了
    回复 有任何疑惑可以回复我~ 2019-03-24 23:03:11
问题已解决,确定采纳
还有疑问,暂不采纳
Python工程师面试宝典 一线大厂资深面试官亲授
  • 参与学习       1013    人
  • 解答问题       92    个

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

了解课程
意见反馈 帮助中心 APP下载
官方微信