同步與互斥的概念
當執行緒併發執行時,由於資源共享和執行緒協作,使用執行緒之間會存在以下兩種制約關係。
1.間接相互制約。乙個系統中的多個執行緒必然要共享某種系統資源,如共享cpu,共享i/o裝置,所謂間接相互制約即源於這種資源共享,印表機就是最好的例子,執行緒a在使用印表機時,其它執行緒都要等待。
間接相互制約可以稱為互斥,直接相互制約可以稱為同步,對於互斥可以這樣理解,執行緒a和執行緒b互斥訪問某個資源則它們之間就會產個順序問題——要麼執行緒a等待執行緒b操作完畢,要麼執行緒b等待執行緒操作完畢,這其實就是執行緒的同步了。因此同步包括互斥,互斥其實是一種特殊的同步。
由於執行緒共享程序的資源和位址空間,所以在訪問到他們的公共資源的時候,一定會出現執行緒的同步和互斥現象,多執行緒訪問乙個資料的次序一定是雜亂無章的,所以這也是我們乙個非常頭疼的乙個問題,這時候我們就可以靈活運用到互斥鎖和訊號量,對乙份資源讓執行緒乙個乙個的訪問,讓程式的可控性提公升.
執行緒同步於互斥實現的四種方式:
臨界區(critical section):適合乙個程序內的多執行緒訪問公共區域或**段時使用
互斥量 (mutex):適合不同程序內多執行緒訪問公共區域或**段時使用,與臨界區相似。
事件(event):通過執行緒間觸發事件實現同步互斥
訊號量(semaphore):與臨界區和互斥量不同,可以實現多個執行緒同時訪問公共區域資料,原理與作業系統中pv操作類似,先設定乙個訪問公共區域的執行緒最大連線數,每有乙個執行緒訪問共享區資源數就減一,直到資源數小於等於零
互斥鎖:用於保證在某一段時間只有乙個執行緒在執行某些**.
互斥鎖的操作流程如下:
1)在訪問共享資源後臨界區域前,對互斥鎖進行加鎖。
2)在訪問完成後釋放互斥鎖導上的鎖。
3)對互斥鎖進行加鎖後,任何其他試圖再次對互斥鎖加鎖的執行緒將會被阻塞,直到鎖被釋放。
條件變數
條件變數用來阻塞執行緒等待某個事件的發生,並且當等待的事件發生時,阻塞執行緒會被通知。
互斥鎖乙個明顯的缺點是它只有兩種狀態:鎖定和非鎖定。而條件變數通過允許執行緒阻塞和等待另乙個執行緒傳送訊號的方法彌補了互斥鎖的不足,它常和互斥鎖一起使用。使用時,條件變數被用來阻塞乙個執行緒,當條件不滿足時,執行緒往往解開相應的互斥鎖並等待條件發生變化。一旦其它的某個執行緒改變了條件變數,它將通知相應的條件變數喚醒乙個或多個正被此條件變數阻塞的執行緒。這些執行緒將重新鎖定互斥鎖並重新測試條件是否滿足。一般說來,條件變數被用來進行線承間的同步。
訊號量
訊號量本質上是乙個非負的整數計數器,它被用來控制對公共資源的訪問。當公共資源增加時,呼叫函式sem_post()增加訊號量。
只有當訊號量值大於0時,才能使用公共資源,使用後,函式sem_wait()減少訊號量。函式sem_trywait()和函式
pthread_ mutex_trylock()起同樣的作用,它是函式sem_wait()的非阻塞版本。
原文:
同步與互斥
雖然多個程序可以共享系統中的各種資源,但其中許多資源一次只能為乙個程序所使用,我們把一次僅允許乙個程序使用的資源稱為臨界資源。許多物理裝置都屬於臨界資源,如印表機等。此外,還有許多變數 資料等都可以被若干程序共享,也屬於臨界資源。對臨界資源的訪問,必須互斥地進行,在每個程序中,訪問臨界資源的那段 稱...
同步與互斥
在多道程式系統中,由於程序併發,資源共享與程序協作,使得程序間可能產生兩種形式的制約 1 間接相互制約 源於資源共享,如果程序ab共享一種資源,如果a請求資源時發現程序b正在訪問這種資源,那麼程序a就進入阻塞佇列,當程序b釋放資源,程序a被喚醒到就緒狀態 2 直接相互制約 源於程序協作,如果程序a通...
同步與互斥
現代作業系統基本都是多工作業系統,即同時有大量可排程實體在執行。在多工作業系統中,同時執行的多個任務可能 這兩種情形是多工程式設計中遇到的最基本的問題,也是多工程式設計中的核心問題,同步和互斥就是用於解決這兩個問題的。互斥 是指散步在不同任務之間的若干程式片斷,當某個任務執行其中乙個程式片段時,其它...