在所有專案中,進入和退出臨界區時都有輸出以表示已進入和退出臨界區。臨界區內的操作是將公共變數
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,關於該結構體的內部結...