2011-06-11 65 views
1

我已經在共享內存中實現了peterson的互斥算法。我正在使用C++和java進程(使用jni)進行通信的共享內存。問題是,我仍然看到一個競爭條件不知何故。如果我嘗試使用printf/println進行調試,代碼開始運行正常,但只要我刪除這些打印,進程就會停止。 有人可以請教我,哪裏可能是問題?我確信peterson算法的實現是正確的。 我應該使用信號量(semget())來相互排斥嗎?peterson在共享內存中鎖定的問題

回答

4

要正確實施算法,您必須使用屏障來確保以您在代碼中指定的順序讀取/寫入內存。閱讀here的第二段:

大多數現代CPU重新排序內存訪問以提高執行效率(請參閱允許重新排序類型的內存排序)。這樣的處理器通常通過存儲器屏障指令給出某種方式來強制在存儲器訪問流中進行排序。在對存儲器訪問進行重新排序的處理器上實現Peterson和相關算法通常需要使用這些操作來正確工作,以保持順序操作不正確的順序發生。請注意,即使對不重新排序指令的處理器(例如Xbox 360中的PowerPC處理器),也可能發生內存訪問的重新排序。

是的,使用系統提供的同步機制(互斥體)而不是重新發明輪子。

+0

我有想過存儲器記錄!無論如何非常感謝。我現在會使用互斥鎖。 – Neal 2011-06-11 21:09:16

0

我認爲你的問題將與不互相排斥,但sycronyzation有關。 Peterson算法僅確保一個進程處於關鍵區域,並且不能確保哪些進程應處於關鍵區域。 如果您提到的問題是正確的,我建議使用Moniter作爲sycronyzing。

0

代碼中應該有一些關鍵部分由進程共享。當你沒有鎖定的情況下運行程序時,輸出將會不同且不明確,因此我們可以驗證你的代碼是否正常工作。

問題是您正在使用print語句,當您刪除它們時,應該有共享的東西。

你能分享你使用的是什麼樣的邏輯來Peterson算法

訪問:Peterson Algorithm