total结果不同的问题

来源:8-3 python的GIL真的会导致多线程慢吗?

小禹o0

2020-03-30

老师你好,我有一个疑问,add和desc方法分别对total进行+1和-1操作,虽然线程之间根据时间片不断切换,但是最终这个两个线程都是对total进行1000000次的操作,主线程等待两个线程运行结束,最终结果不应该还是0吗

写回答

1回答

bobby

2020-03-31

说明你还没有懂这个地方的原因,这是一个经典的不同步的问题。因为 add += 1 分为3步:

    1. 从内存中获取 num的值

    2. 对num加一

    3. 将值保存到内存中

如果这三个操作是不可打断的,那么就没问题,但是如果第一步完成以后 就被打断了, 比如A线程读取 num为0 A被切换了, 然后B线程也读取了值为0, 然后A加一之后num为1, 然后切换到B线程num减一为-1, 然后切换到A线程,这个时候num的值为1, 然后又切换到B这个时候内存的值被设置的-1, 这个时候两个线程都执行了 但是结果却为-1,就出问题了

5
3
15天冲
终于有人能讲明白了,我之前也一直不懂这个,老师厉害!!
2021-03-02
共3条回复

Python爬虫工程师实战 大数据时代必备

慕课网严选精品教程,高质量内容+服务!

2377 学习 · 1158 问题

查看课程