當作業系統進入多道批處理系統時代以後。乙個系統中就存在多個任務,每乙個任務都依照一定的演算法進行排程來使用記憶體、cpu等共享資源。
當當中乙個任務等待其它資源時,該任務能夠臨時睡眠,作業系統排程另外任務繼續執行額,這樣能夠使系統資源得到最大化利用。而無需像曾經單道批處理系統那樣僅僅有當乙個任務完畢之後才執行下乙個任務。
可是由此也引入了多工併發的問題。
併發就是多個任務同一時候執行,在如今的一般大型應用系統中,乙個功能基本有多個任務共同完畢,每乙個任務相互協調。互相配合以及交換資訊。如此一來,我們須要考慮併發任務的同步與相互排斥了。
所謂同步,就是一件事情須要依照先後順序去完畢,當乙個任務和還有乙個任務通訊時,任務a獲取還有乙個任務b的資訊,當任務b未返回資訊時,任務a持續等待,直到b返回資訊回來,a再繼續執行。
非同步是和同步相對的乙個概念,就是任務a向b請求資訊時。不必等待b資訊的返回,a請求完畢之後直接做下一件事情。
所謂相互排斥就是某些資源在某一時刻僅僅能由乙個任務占有。在某資源被任務a占有的情況下。其它須要占有該資源的任務b必須等待,任務a使用完該資源後釋放後任務b才幹使用該資源。一般這種資源被稱作臨界資源,有的時候一段程式不同意併發執行。這段程式被稱作臨界區。
要解決同步相互排斥問題。
最基本的是理清楚活動者之間的同步關係,
還有某些
問題中變數的相互排斥問題。
我們來看看生產者消費者問題。
生產者消費者問題是乙個經典的程序同步問題。
它描寫敘述的是: 有一群生產者程序在生產產品, 並將此產品提供給消費者程序去消費。為使生產者程序和消費者程序能併發執行, 在它們之間設定有個緩衝區的緩衝池。 生產者程序可將它所生產的產品放入乙個緩衝區中,消費者程序可從乙個緩衝區取得乙個產品消費。雖然全部的生產者程序和消費者程序都是以非同步的方式執行的。但它們之間必須保持同步。即不同意消費者程序到乙個空緩衝區去取產品, 也不同意生產者程序向乙個已裝滿產品的緩衝區投放產品。
我們這樣來描寫敘述這個問題, 假如緩衝池中有n個緩衝區。每乙個緩衝區存放乙個訊息,生產者和消費者程序(或執行緒)對緩衝區相互排斥的訪問。僅僅要緩衝池未滿,生產者可將訊息送入緩衝池;僅僅要緩衝池未空,消費者可從緩衝池取走乙個訊息。 此時生產者和消費者須要保持同步。當緩衝池為空時,生產者通知消費者不要再來取資料。當不為空時,通知消費者能夠來取資料。
在linux中,實現同步與相互排斥的方法有非常多,比方訊號量等,執行緒還有專用的執行緒相互排斥鎖以及條件變數。本系列文章將對各種實現同步相互排斥的方法進行分析以及給出演示樣例,而且大多演示樣例都基於生產者消費者模型來闡述。
執行緒同步與相互排斥 相互排斥鎖
在多工作業系統中,同一時候執行的多個任務可能都須要使用同一種資源。這個過程有點類似於,公司部門裡。我在使用著印表機列印東西的同一時候 還沒有列印完 別人剛好也在此刻使用印表機列印東西,假設不做不論什麼處理的話,列印出來的東西肯定是錯亂的。以下我們用程式模擬一下這個過程。執行緒一須要列印 hello ...
自旋鎖與相互排斥鎖之抉擇
自旋鎖和相互排斥鎖是多執行緒程式設計中的兩個重要概念。他們都能用來鎖定一些共享資源,以阻止影響資料一致性的併發訪問。可是他們之間確實存在差別,那麼這些差別是什麼?理論上,當乙個執行緒試圖獲取乙個被鎖定的相互排斥鎖時,該操作會失敗然後該執行緒會進入睡眠,這樣就能立即讓還有乙個執行緒執行。當持有相互排斥...
Linux 互斥與同步
使用互斥鎖之前必須要建立乙個鎖的物件。互斥鎖的型別為pthread mutex t,建立乙個變數就是建立了乙個互斥鎖,我們通過這個變數建立開鎖和解鎖的聯絡。但這個鎖還不能夠直接使用,需要對其進行初始化。我們對建立好的鎖進行初始化的方法有兩種 第二個引數attr 如果傳入null,互斥鎖的屬性設定為預...