1. 程式人生 > >5.1.15 線程的互斥鎖

5.1.15 線程的互斥鎖

n) splay threading 內存 PE tar TE play ID

from threading import Thread, Lock
import time

n = 100


def task():
    global n
    # mutex.acquire()
    temp = n
    time.sleep(0.1)
    n = temp - 1
    # mutex.release()


if __name__ == __main__:
    # mutex = Lock()
    t_l = []
    for i in range(100):
        t = Thread(target=task)
        t_l.append(t)
        t.start()

    
for t in t_l: t.join() print(, n)

運行結果:

技術分享圖片
主 99
View Code

加了互斥鎖:

# mutex
from threading import Thread, Lock
import time

n = 100


def task():
    global n
    mutex.acquire()
    temp = n
    time.sleep(0.1)
    n = temp - 1
    mutex.release()


if __name__ == __main__:
    mutex 
= Lock() # 與子進程的區別是:子線程共享進程內的內存空間,所以無需把鎖傳給線程。進程內的所有線程用的就是同一把鎖。
             # 開進程的話,進程與子進程之間的數據是獨占的,所以各子進程之間的數據都是獨立的,鎖也就不是同一把鎖。故需要把鎖傳給子進程,確保各子進程用的是同一把鎖。 t_l
= [] for i in range(100): t = Thread(target=task) t_l.append(t) t.start() for t in t_l: t.join()
print(, n)

運行結果:

技術分享圖片
主 0
View Code

互斥鎖的作用:將並行變成串行。

5.1.15 線程的互斥鎖