程序間同步臨界區的Peterson演算法

2021-05-09 16:00:01 字數 1254 閱讀 8314

在所有專案中,進入和退出臨界區時都有輸出以表示已進入和退出臨界區。臨界區內的操作是將公共變數

icount

這個兩個執行緒的公共變數疊加到

50,000,000

然後輸出,以此證明執行緒成功進入臨界區,滿足互斥;因為倘若沒有實現互斥,兩線程間的干擾會導致資料一致性問題而使

icount

不能準確加到

50,000,000

。從實驗結果中,可以看出所有進入臨界區的執行緒都至少滿足互斥。為了保證實驗的正確性,我們多次執行執行緒(程式中設為

5次),這些後面將不再贅述。

演算法一:

演算法一是錯誤的,因為它不符合有空讓進的要求。為了實驗效果明顯,更有說服力,在專案中故意增加了0號執行緒的剩餘區的操作時間,並隔一段時間輸出在剩餘區這一狀態。從實驗專案的執行結果可以看出。0號執行緒進入臨界區完成操作退出後,1號執行緒進入臨界區並完成操作,退出後,此時0號執行緒已進入其退出區,而1號執行緒因為無退出區操作,故現在正在等待進入臨界區,可是因為演算法的錯誤,導致1號執行緒不能進入其臨界區(從實驗結果中看出,長時間0號輸出其在剩餘區的狀態,而1號未進入其臨界區)此時等待進入臨界區的只有1號執行緒,明顯不符合有空讓進的要求。事實上,從輸出可以看出,此演算法使兩線程嚴格交替著進入其相應的臨界區。

演算法二:

waitformultipleobjects

中有個時間限制,因為這個演算法有可能會導致兩線程都進入

while

的無限迴圈,從而導致兩著都無法自動關閉,程式無法正常退出。當剛好每個執行緒的

flag

[ithreadid] = true

語句依次連續執行時,就會導致兩線程都在

while

語句中無限迴圈。從實驗結果中可見,

0號執行緒只進入臨界區2次、

1號執行緒只進入臨界區

1次,就進入了無限迴圈中,直到

waitformultipleobjects

超時,程式退出。

演算法三:

演算法三是正確的,這個才是

peterson

演算法的正確表達形式。

這是我的作業系統實驗的一些內容,達人們肯定覺得淺顯。沒事就發上來了,搞了好久那個貼圖都沒搞滿意,如果要看直接執行了然後看吧,我就不貼弄了。

若要使用原始碼,請註明出處,歡迎**(不過,我覺得可能性很小,嘿嘿!)

最後,歡迎拍磚吧!

執行緒同步之臨界區

臨界區 當兩個執行緒競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的 區稱作臨界區。臨界區執行緒同步適用範圍 它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的 快同步,效率比較高。在.net中有monitor lock等方式是以臨界區的方式來實現執...

linux C 程序間共享記憶體以及臨界區的實現

不多說,直接貼 就是了 ifndef sharehelper h included define sharehelper h included include include include include include include include include include includ...

windows多執行緒同步 臨界區

推薦參考部落格 秒殺多執行緒第五篇 經典執行緒同步 關鍵段cs 關於臨界區的觀念,一般作業系統書上面都有。適用範圍 它只能同步乙個程序中的執行緒,不能跨程序同步。一般用它來做單個程序內的 快同步,效率比較高 windows中與臨界區有關的結構是 critical section,關於該結構體的內部結...