生產(chǎn)者消費(fèi)者問題
關(guān)于生產(chǎn)者消費(fèi)者問題可以參考這篇文章:生產(chǎn)者消費(fèi)者問題的java實(shí)現(xiàn)
臨界區(qū)與互斥量
臨界區(qū):保證在某一時(shí)刻只有一個(gè)進(jìn)程能訪問數(shù)據(jù)的簡便方法,在任意時(shí)刻值允許一個(gè)進(jìn)程對共享資源進(jìn)行訪問。如果有多個(gè)進(jìn)程試圖訪問臨界區(qū),那么在有一個(gè)進(jìn)程進(jìn)入后其他進(jìn)程會被掛起
互斥量:只有擁有互斥對象的進(jìn)程才有訪問資源的權(quán)限,由于互斥對象只有一個(gè),因此就決定了任何情況下次共享資源不會同時(shí)被多個(gè)進(jìn)程訪問?;コ饬勘扰R界區(qū)復(fù)雜,因?yàn)槭褂没コ獠粌H能夠保證在同一應(yīng)用程序下不同線程中實(shí)現(xiàn)資源的安全共享,而且可以在不同應(yīng)用程序的線程之間實(shí)現(xiàn)對資源的安全共享。
同步的解決方案
通常使用管程和信號量來實(shí)現(xiàn)進(jìn)程間的同步
信號量
信號量由整型變量S和兩個(gè)原子操作組成,S是資源的數(shù)量,兩個(gè)原子操作一般被稱為p操作和v操作,為控制一個(gè)具有有限數(shù)量用戶資源而設(shè)計(jì)。
p操作表示申請一個(gè)資源,p操作的定義:S=S-1,若S>=0,則執(zhí)行p操作的進(jìn)程繼續(xù)執(zhí)行;若S<0,則該進(jìn)程置為阻塞狀態(tài),并將其插入阻塞隊(duì)列。
v操作表示釋放一個(gè)資源,v操作的定義:S=S+1,若S>=0.則執(zhí)行v操作;若S<0,則從阻塞狀態(tài)喚醒一個(gè)進(jìn)程,并將其插入就緒隊(duì)列。
信號量在現(xiàn)實(shí)生活中可以找到例子,比如銀行的窗口數(shù)量就是S,在窗口辦理業(yè)務(wù)就是p操作,業(yè)務(wù)辦理結(jié)束就是v操作。
管程
是編程語言提供的一種抽象的數(shù)據(jù)結(jié)構(gòu),用于多線程互斥訪問共享資源。首先,任意時(shí)刻只有一個(gè)線程執(zhí)行管程代碼;其次,正在管程內(nèi)的線程可以放棄對管程的控制權(quán)。
信號量與管程的區(qū)別
- 信號量本質(zhì)上是可以共享的資源的數(shù)量;而管程是一種抽象的數(shù)據(jù)結(jié)構(gòu)用來限制同一時(shí)刻只有一個(gè)線程進(jìn)入臨界區(qū)
- 信號量可以是并發(fā)的,并發(fā)了取決于S的初始值;而管程內(nèi)部同一時(shí)刻只能有一個(gè)線程運(yùn)行
- 信號量與資源的管理緊耦合,管程需要自行判斷是否還有可共享的資源
- 信號量的p操作可能阻塞,也可能不阻塞;管程的wait操作一定會阻塞