python之執行緒鎖與訊號量

2021-08-28 10:50:14 字數 1218 閱讀 5023

乙個程序下可以啟動多個執行緒,多個執行緒共享父程序的記憶體空間,也就意味著每個執行緒可以訪問同乙份資料,此時,如果2個執行緒同時要修改同乙份資料,會出現什麼狀況?

就會可能存在同時取出了乙個資料進行操作,然後存回去,這樣就會丟失一次操作。所以用鎖,在修改之前鎖上資料,修改之後再釋放鎖,期間別人不能使用這個資料。

例子:

import threading

num = 0 #全域性變數

lock = threading.lock() #生成全域性鎖

def add():

global num # 在每個執行緒中都獲取這個全域性變數

lock.acquire() # 修改資料前加鎖

num += 1 # 對此公共變數進行+1操作

lock.release() # 修改後釋放

thread_list =

for i in range(100):

t = threading.thread(target=add)

t.start()

for t in thread_list: # 等待所有執行緒執行完畢

t.join()

print('final num:', num)

執行緒鎖只允許同一時刻乙個執行緒修改變數,如果要在同一時刻允許多個執行緒修改變數,用訊號量。

執行緒鎖同時只允許乙個執行緒更改資料,而訊號量是同時允許一定數量的執行緒更改資料 。

import threading, time

#訊號量

def run(n):

semaphore.acquire()

time.sleep(1) #控制每個執行緒1秒執行時間

print("run the thread: %s\n" % n)

semaphore.release()

semaphore = threading.boundedsemaphore(3) # 最多允許5個執行緒同時執行

for i in range(20):

t = threading.thread(target=run, args=(i,))

t.start()

while threading.active_count() != 1: #還有執行緒在活動就不結束

pass

else:

print('----all threads done---')

執行緒與訊號量

訊號量的資料型別為結構sem t,它本質上是乙個長整型的數。函式sem init 用來初始化乙個訊號量。它的原型為 extern int sem init p sem t sem,int pshared,unsigned int value sem為指向訊號量結構的乙個指標 pshared不為 時此...

執行緒與訊號量

file1 file1實現了1個訊號量,對兩個執行緒的同步.include include include pthread t pthid1,pthid2 sem t sem static void fun1 void arg static void fun2 void arg int main i...

python訊號量 Python訊號量

python訊號量教程 訊號量是由作業系統管理的一種抽象資料型別,用於在多執行緒中同步對共享資源的使用。本質上說,訊號量是乙個內部資料,用於標明當前的共享資源可以有多少併發讀取。也可以簡單的理解為,訊號量是多把鎖,同時允許多個執行緒來更改資料,而 python訊號量與互斥鎖的關係 訊號量的乙個特殊用...