问答

CPython解释器存在 GIL,为何用两个线程累加 1000000 次,结果不

作者:admin 2021-08-20 我要评论

CPython解释器存在 GIL,GIL 可以保证同一个时刻只有一个线程占用解释器,按理来说两个线程同一时刻只能有一个来访问全局变量才对,但两者同时累加 1000000 次,...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

CPython解释器存在 GIL,GIL 可以保证同一个时刻只有一个线程占用解释器,按理来说两个线程同一时刻只能有一个来访问全局变量才对,但两者同时累加 1000000 次,结果却不是 2000000,这是怎么回事?

难道累加并不是原子操作,会在执行了一半的过程中被打断吗?

image.png

###

GIL只是让单字节码解释成为原子操作,而i = i + 1一般包含4条字节码,所以累加不是原子操作

LOAD_FAST                0 (i)
LOAD_CONST               2 (1)
BINARY_ADD
STORE_FAST               0 (i)
###

楼上已经讲了GIL保证的原子操作是什么了

那我说一下什么要用GIL:

1) CPython中的GC算法用的是引用计数,CPython会获取GIL以保证它对对象引用计数的更新是全局同步的
2) 太难改且人家认为没必要。事实上Java的HotSpot虚拟机最早也是有GIL的,后来改了好多年之后才改成细粒度的锁了。

当然以上都不是根本原因,根本原因就是懒得改...

###

分享一篇:https://www.97up.cn/post/136

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 使用箭头函数return数据不能实现

    使用箭头函数return数据不能实现

  • 个人小程序号能接入小程序3D地图吗?

    个人小程序号能接入小程序3D地图吗?

  • vue 移动端项目中,使用了better-scrol

    vue 移动端项目中,使用了better-scrol

  • css如何做出区域平均划分为四列

    css如何做出区域平均划分为四列

腾讯云代理商
海外云服务器