為了避免多個執行緒對同乙個資料進行讀寫,我們要將各個執行緒進行同步。所謂同步,就是指在乙個執行緒訪問資料未結束的時候,其他執行緒不得對同一資料進行訪問。
同步最常用的方法是鎖。
是最簡單的一種鎖,只有兩種狀態:占用和非占用。她適合只能被唯一乙個執行緒獨佔訪問的資源。
允許多個執行緒併發訪問的資源適合使用訊號量。乙個初始值為n的訊號量允許被n個執行緒併發訪問。
當執行緒訪問資源時,訊號量的值減1。
如果訊號量值=0,則不允許訪問共享資源。
訪問完資源後,釋放訊號量,訊號量的值+1。
和二元訊號量很像,資源僅允許乙個執行緒訪問。不同的是訊號量可以被任意執行緒獲取釋放,也就是說,乙個執行緒獲取訊號量之後可以被另乙個執行緒釋放。而互斥量要求哪個執行緒獲取了互斥量就要由哪個執行緒釋放。
臨界區和互斥量訊號量的區別是,互斥量訊號量在任何程序中里都是可見的,也就是說,乙個程序建立了互斥量或訊號量,另乙個程序訪問這個互斥量或訊號量是合法的。而臨界區的作用範圍僅限於本程序,其他程序無法獲取該鎖。
使用訊號量、互斥量和臨界區保證同步,儘管能夠保證程式正確,但是對於頻繁讀偶爾寫的操作,效率會很低。讀寫鎖可以解決這個問題。讀寫鎖有兩種獲取方式,共享的(shared)和獨佔的(exclusive)。
當鎖處於自由態的時候,以任何一種方式獲取鎖都能成功;
當鎖處於共享狀態時,其他執行緒以shared方式獲取鎖會成功,以exclusive方式獲取鎖,需要等待鎖被其他所有執行緒釋放完畢後才能獲取。
當鎖處於獨佔狀態時,以shared和exclusive方式獲取鎖都需要等待鎖被其他所有執行緒釋放完畢。
讀寫鎖的狀態
以shared方式獲取
以exclusive方式獲取
自由成功
成功共享
成功等待
獨佔等待
等待對於條件變數,執行緒有兩種操作:等待和喚醒。執行緒可以等待條件變數,乙個條件變數可以被多個執行緒等待。執行緒也可以喚醒條件變數,此時所有等待條件變數的執行緒都將被喚醒。
也就是說,條件變數可以讓許多執行緒一起等待某個某個事件的發生,當某個事件發生時(條件變數被喚醒時),所有執行緒可以一起恢復執行。
執行緒同步與鎖
二元訊號量和多元訊號量,是乙個變數,獲取 1,釋放 1,當變數處於 0的情形下才可以被獲取。乙個執行緒的獲取可以用另乙個執行緒來釋放。很像二元訊號量,但是釋放只能是本執行緒。臨界區是比互斥量更加嚴格的同步手段,訊號量和互斥量可以不同程序之間操作,也就是說 乙個程序建立了乙個互斥量或訊號量,另乙個程序...
多執行緒同步與鎖
多執行緒同步與鎖 本次主要討論的是lock,autoeventset,moniter 如下 上圖為執行緒1,2執行write1,被阻塞,直到執行緒4發出訊號,執行緒1,2收到訊號後取得執行權的執行緒可以執行 改下main 上圖為執行緒3,5執行write2,執行緒4執行wirte4,首先取得lock...
執行緒同步鎖
同步鎖 對於兩個函式a,b,建立兩條執行緒,並且讓其睡眠,流程上看似輪流執行,其實不是,因為涉及到cpu切換去執行問題。import threading import time def a for i in range 3 print a str i time.sleep 0.01 def b fo...