乙個程序下可以啟動多個執行緒,多個執行緒共享父程序的記憶體空間,也就意味著每個執行緒可以訪問同乙份資料,此時,如果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訊號量與互斥鎖的關係 訊號量的乙個特殊用...