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

发布于 2022-09-12 02:36:55 字数 219 浏览 18 评论 0

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

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

image.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

陪我终i 2022-09-19 02:36:55

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

LOAD_FAST                0 (i)
LOAD_CONST               2 (1)
BINARY_ADD
STORE_FAST               0 (i)
口干舌燥 2022-09-19 02:36:55

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

那我说一下什么要用GIL:

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文