import threading num = 0 def write1(): global num i = 1 while i <= 1000000: num += 1 i += 1 print("result1:%d" % num) def write2(): global num i = 1 while i <= 1000000: # 因为 num 是全局变量,但num += 1 是分三步执行的(详情看总结) # 若没有加锁,就会出现抢夺资源( num +=1 还没执行完,另外一个线程拿这个变量去使用),就会致使 num 的最终值出现错误 num += 1 i += 1 print("result2:%d" % num) def main(): # 建立两个线程 p1 = threading.Thread(target=write1) p2 = threading.Thread(target=write2) # 开启线程 p1.start() p2.start() if __name__ == "__main__": main()
result1:1180321 result2:1567595
以上 result2 结果不是一个定值,各类值状况都会出现python
import threading num = 0 def write1(lock): global num i = 1 while i <= 1000000: lock.acquire() num += 1 lock.release() i += 1 print("result1:%d" % num) def write2(lock): global num i = 1 while i <= 1000000: # 因为 num 是全局变量,但num += 1 是分三步执行的 # 若没有加锁,就会出现抢夺资源( num +=1 还没执行完,另外一个线程拿这个变量去使用),就会致使 num 的最终值出现错误 lock.acquire() num += 1 lock.release() i += 1 print("result2:%d" % num) def main(): # 建立一个锁 lock = threading.Lock() # 建立两个线程 p1 = threading.Thread(target=write1, args=(lock,)) p2 = threading.Thread(target=write2, args=(lock,)) # 开启线程 p1.start() p2.start() if __name__ == "__main__": main()
result1:1996142 result2:2000000 # 由于每一个线程都会1000000次+1,因此哪一个线程最后一次+1输出结果确定是2000000
① 线程之间是共用全局变量的,由于线程是一个进程里分出来的几个任务,使用的是用同一份代码,一样的变量与资源。ui
② 互斥锁通常用在线程须要 共享全局变量 的时候线程
③ 进程与线程之间的关系与区别:code
④ num += 1 分三步执行:进程