## 多線程共享全局變量 但是 因為線程執行是無須的 所以會出現資源競爭的問題 如下所示
這樣會導致得到的數據不符合我們的期望。為了解決資源競爭的問題,線程中有兩個解決辦法:
1. 線程同步,第一個線程執行完畢后,第二個才開始,如上圖25行
2. 利用互斥鎖,如下代碼:
import threading
num = 0
# 創建互斥鎖
lock = threading.Lock()
# 任務1:循環1000000次每循環1次全局變量加1
def sum1():
? ? # 上鎖
? ? lock.acquire()
? ? global num
? ? for i in range(1000000):
? ? ? num += 1
? ? print("sum1:", num)
? ? # 釋放鎖
? ? lock.release()
# 任務2:循環10000000次每循環1次全局變量加1
def sum2():
? ? # 上鎖
? ? lock.acquire()
? ? global num
? ? for i in range(1000000):
? ? ? ? num += 1
? ? print("sum2:", num)
? ? # 釋放鎖
? ? lock.release()
if __name__ == '__main__':
? ? # 創建兩個線程分別執行對應相加任務
? ? first_thread = threading.Thread(target=sum1)
? ? second_thread = threading.Thread(target=sum2)
? ? first_thread.start()
? ? second_thread.start()
? ? # 互斥鎖: 保證同一時刻只有一個線程去執行代碼,其它線程沒有搶到鎖會等待
? ? # 提示:加上互斥鎖,哪個線程搶到鎖我們決定不了,因為,線程執行是無序
? ? # 注意點: 線程同步和加上互斥鎖把多任務瞬間該成單任務,性能會下降
# 注意:加上鎖之后要及時釋放鎖,否則會出現死鎖。