記憶體混亂及解決方法和死鎖問題

无悔的选择發表於2024-08-28

首先,來看這一段程式碼

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()會阻塞,因為鎖已經被佔用了。這樣程式就會一直執行下去,無法繼續執行

相關文章