首先,來看這一段程式碼
import threading
i=0
def sum1():
global i
for x in range(100000000):
i+=x
i-=x
print('sum1',i)
def sum2():
global i
for x in range(100000000):
i+=x
i-=x
print('sum2',i)
thr1=threading.Thread(target=sum1)
thr2=threading.Thread(target=sum2)
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print(i)
會輸出什麼?
答案是不確定,因為執行緒sum1和執行緒sum2都在對全域性變數i進行操作,會競爭i,導致i值不確定,因此,輸出結果是不確定的。那麼怎麼解決這個問題?
import threading
lock=threading.Lock()
i=0
def sum1():
global i
#上鎖
if lock.acquire():
for x in range(100000000):
i+=x
i-=x
lock.release()
print('sum1',i)
def sum2():
global i
if lock.acquire():
for x in range(100000000):
i+=x
i-=x
lock.release()
print('sum2',i)
thr1=threading.Thread(target=sum1)
thr2=threading.Thread(target=sum2)
thr1.start()
thr2.start()
thr1.join()
thr2.join()
print(i)
在這段程式碼中,使用了鎖來保護對i的訪問,這樣,每個執行緒在操作i時都會先獲取鎖,操作完成後釋放鎖。這樣可以確保i的值在多執行緒環境下是確定的
什麼是死鎖問題?
舉例:
locl=threading.Lock()
lock.acquire()
lock.acquire()
lock.release()
這段程式碼會導致死鎖,因為第一個lock.acquire()獲取了鎖,第二個lock.acquire()會阻塞,因為鎖已經被佔用了。這樣程式就會一直執行下去,無法繼續執行