互斥鎖與多執行緒間共享全域性變數

2022-04-09 09:58:14 字數 1885 閱讀 3841

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...