多线程无同步时同时读写同一变量会产生什么问题?
无同步机制下线程并发读写/更新变量的行为分析
当读取操作发生在更新操作之前或之后时,结果一目了然,但两者并发执行且未使用任何同步机制时,就会出现未定义行为,具体分两种场景来看:
1. 一个线程读取变量,另一个线程同时更新变量
以你给出的代码为例,thread1负责把value设为5,thread2负责读取并打印value:
from threading import Thread value = 0 def thread1(): global value value = 5 def thread2(): global value print(value) if __name__ == "__main__": thread1 = Thread(target=thread1) thread2 = Thread(target=thread2) thread1.start() thread2.start()
运行这段代码,可能出现两种结果:
- 打印
0:说明线程调度让thread2的读取操作先完成,thread1的赋值还没生效 - 打印
5:说明thread1的赋值操作先执行完毕,thread2读到了更新后的值
要注意的是,Python中对单个整数的赋值是原子操作,不会出现“读到一半的中间值”(比如既不是0也不是5的情况),但线程的执行顺序完全由操作系统调度决定,每次运行结果都可能不同。
2. 两个线程同时更新变量
如果把thread2里的注释打开,让它也对value赋值(比如设为10),此时两个线程同时修改同一个变量:
from threading import Thread value = 0 def thread1(): global value value = 5 def thread2(): global value value = 10 if __name__ == "__main__": thread1 = Thread(target=thread1) thread2 = Thread(target=thread2) thread1.start() thread2.start()
这种场景下,最终value的结果要么是5,要么是10,取决于哪个线程的赋值操作最后完成。同样因为整数赋值是原子操作,不会出现混合两个赋值的异常值,但结果依然不可预测。
总结
这种无同步的并发操作属于数据竞争场景,线程间的执行顺序没有任何保证,结果完全依赖操作系统的调度。如果需要确定的行为,必须使用同步机制,比如threading.Lock(),确保同一时间只有一个线程访问或修改共享变量。
内容的提问来源于stack exchange,提问作者user19551894
相关产品推荐
相关产品推荐

