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 分三步執行:進程