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結果不是乙個定值,各種值情況都會出現
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:
# 此處加了鎖,跑得快的執行緒會先上鎖,使得另乙個執行緒遇到鎖時會堵塞,即原地等待。
lock.acquire()
# 由於 num 是全域性變數,但num += 1 是分三步執行的
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
④ num += 1分三步執行:
多執行緒共享全域性變數(執行緒間通訊)
修改全域性變數一定需要加global嗎?num 100lis 11 22 def demo global num num 100def demo1 33 未修改指向 只是修改了指向空間的資料 不用加global defdemo2 global lis lis lis 44 修改了指向 要加上glob...
多執行緒共享變數 多執行緒共享全域性變數
1.多執行緒的執行順序是無序的 像2個人賽跑,乙個先跑乙個後跑,但根據每個人跑的速度不一樣,跑一半,二者可能跑在一起去了。2.又因為多執行緒是共享乙個全域性變數的,就導致資料容易被弄髒 假如老闆讓兩個員工寫兩個主題ppt,若這兩個人沒商量好,都做了同乙個主題的ppt,導致不但速度很慢,且這個ppt有...
7 多執行緒 全域性變數 共享全域性變數
多執行緒 全域性變數 共享全域性變數 多執行緒可以對全域性變數進行修改,修改後的結果會影響下乙個執行緒 程序不可以共享全域性變數,子程序是複製父程序的全域性變數,修改後互不影響 from threading import thread import time,random g num 100 def...