網路程式設計 執行緒 6 互斥鎖解決執行緒中資料安全問題

2022-03-10 13:52:40 字數 2039 閱讀 2552

前沿:上一節說到多個執行緒之間共享全域性變數會存在乙個問題:資源爭搶,資料混亂不安全。這一節就是如何解決共享全域性變數時資料不安全的問用到的知識點:互斥鎖,threading模組中有個lock類,可以建立乙個鎖物件,呼叫acquire方法(給執行緒上鎖)和release方法(給執行緒釋放鎖),這樣就可以解決資源爭搶問題了
1、那麼什麼叫互斥鎖?它的工作原理是什麼樣的?還是畫圖說明:

2、以下面具體**為例,

下面例子的大概意思就是,建立倆個執行緒函式,,每個執行緒函式都是修改全域性變數,然後給每個執行緒函式上鎖,解鎖:

import

threading

import

time

""" 這一節就是如何解決共享全域性變數時資料不安全的問題

用到的知識點:互斥鎖,threading模組中有個lock類,可以建立乙個鎖物件,

呼叫acquire方法(給執行緒上鎖)和release方法(給執行緒釋放鎖),這樣就可以解決資源爭搶問題了

"""#

下面例子的大概意思就是,建立倆個執行緒函式,,每個執行緒函式都是修改全域性變數,然後給每個執行緒函式上鎖,解鎖

num =0

muter = threading.lock() #

建立乙個鎖物件

deftest1(temp):

global

num muter.acquire()

#將執行緒函式test1修改全域性變數值得**進行上鎖

for i in

range(temp):

num += 1muter.release()

#將執行緒函式test1修改全域性變數值得**進行解鎖

print('

test1-num:%d

' %num)

deftest2(temp):

global

num muter.acquire()

#將執行緒函式test2修改全域性變數值得**進行上鎖

for i in

range(temp):

num += 1muter.release()

#將執行緒函式test2修改全域性變數值得**進行解鎖

print('

test1-num:%d

' %num)

defmain():

t1 = threading.thread(target=test1, args=(1000000,))

t2 = threading.thread(target=test2, args=(1000000,))

t1.start()

t2.start()

time.sleep(1)

print('

num:%d

' %num)

if__name__ == '

__main__':

main()

執行結果如下:

test1-num:1000000

test1-num:2000000

num:2000000

如果沒有加互斥鎖的話,執行結果每次都是混亂的,如下:test1-num:1129808

test1-num:1235738

num:1235738

注意點:用互斥鎖時,也容易造成死鎖,死鎖就是:加入執行緒a等待執行緒b釋放鎖,執行緒b也在等待執行緒a釋放鎖,這就造成死鎖,解決死鎖的方法就是新增乙個超時等待時間
下一節講程序系列的知識。。。。。。。。。

Linux多執行緒程式設計 執行緒互斥鎖

通過下面的練習加深對執行緒的概念的理解,同時明確執行緒的控制。從而進一步了解執行緒的互斥,並學會利用pthread庫。定義乙個用於互斥的互斥鎖 和乙個主函式和兩個子執行緒都能訪問的共享變數,乙個主函式和兩個用來建立子執行緒的子函式 在主函式中定義兩個子執行緒id的變數,初始化互斥鎖,建立對應函式的子...

linux程式設計 執行緒 互斥鎖

執行緒間同步機制 互斥鎖通訊機制 互斥以排他方式防止共享資料被併發修改。1 在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,並立即占有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。2 只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作...

多執行緒程式設計 互斥鎖

多執行緒程式設計 互斥鎖 1 引言 互斥鎖,是一種訊號量,常用來防止兩個程序或執行緒在同一時刻訪問相同的共享資源。可以保證以下三點 1 原子性 把乙個互斥量鎖定為乙個原子操作,這意味著作業系統 或pthread函式庫 保證了如果乙個執行緒鎖定了乙個互斥量,沒有其他執行緒在同一時間可以成功鎖定這個互斥...