1. 程式人生 > >執行緒及其互斥鎖:

執行緒及其互斥鎖:

執行緒及其互斥鎖:

執行緒共享全域性變數,但是當多個執行緒對同一個變數進行操作時,會出現混亂,為了解決這個問題,我們可以用輪詢以及互斥鎖的方法,對多個執行緒實現同步控制。

互斥鎖的工作原理:

當某個執行緒要改共享資料時,先將其鎖定,此時資源狀態為“鎖定”,其他執行緒不能更改;直到該執行緒釋放資源,互斥鎖保證了每次只有一個執行緒進行讀寫操作,從而保證了多執行緒情況下資料的正確性。

注意:互斥鎖在運用時,必須在每個執行緒中都上鎖,這樣多個執行緒才會搶著上鎖。

死鎖的解決辦法:

設定超時時間:在加鎖時設定一定的時間,如果時間到了,還不滿足時間,則預設會不加鎖執行。

在設計時利用銀行家演算法

建立互斥鎖的步驟:

Mutex = threading.Lock() #建立鎖物件

Mutdex.acquire(blocking)#鎖定

Mutdex.release()#釋放

方法一:輪詢的方法

from threading import Thread

import time

num = 0

flag = False

 

def fun1():

    global num

    global flag

    if flag == False:

        for i in range(100000):

            num += 1

        flag = True

        print("fun1的結果:{}".format(num))

 

def fun2():

    global num

    while True:

        if flag == True:

            for i in range(100000):

                num += 1

            print('fun2的結果:%d' % num)

            break

 

thread1 = Thread(target=fun1)

thread2 = Thread(target=fun2)

thread1.start()

thread2.start()

方法二:互斥鎖

from threading import Thread, Lock

import time

num = 0

lock = Lock()

def fun1():

    lock.acquire()

    global num

    for i in range(100000):

        num += 1

    print("fun1的結果:{}".format(num))

    lock.release()

 

def fun2():

    lock.acquire()

    global num

    for i in range(100000):

        num += 1

    print('fun2的結果:%d' % num)

    lock.release()

 

thread1 = Thread(target=fun1)

thread2 = Thread(target=fun2)

thread1.start()

thread2.start()