互斥鎖與多線程間共享全局變量

互斥鎖

1、 代碼展現

① 沒加鎖(X)

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

2、 總結

  • ① 線程之間是共用全局變量的,由於線程是一個進程裏分出來的幾個任務,使用的是用同一份代碼,一樣的變量與資源ui

  • ② 互斥鎖通常用在線程須要 共享全局變量 的時候線程

  • 進程與線程之間的關係與區別:code

    • ① 進程 包含 多個線程
    • ② 進程間 不共用 變量與資源;線程間 共用 變量與資源
  • ④ num += 1 分三步執行:進程

      1. cpu從內存中讀取num的值(例如 num = 0
      2. cpu把讀取到的num值加1(num + 1 = 1
      3. cpu把計算完的值從新賦值給內存(num = 1
相關文章
相關標籤/搜索