我已經在共享內存中實現了peterson的互斥算法。我正在使用C++和java進程(使用jni)進行通信的共享內存。問題是,我仍然看到一個競爭條件不知何故。如果我嘗試使用printf/println進行調試,代碼開始運行正常,但只要我刪除這些打印,進程就會停止。 有人可以請教我,哪裏可能是問題?我確信peterson算法的實現是正確的。 我應該使用信號量(semget())來相互排斥嗎?peterson在共享內存中鎖定的問題
1
A
回答
4
要正確實施算法,您必須使用屏障來確保以您在代碼中指定的順序讀取/寫入內存。閱讀here的第二段:
大多數現代CPU重新排序內存訪問以提高執行效率(請參閱允許重新排序類型的內存排序)。這樣的處理器通常通過存儲器屏障指令給出某種方式來強制在存儲器訪問流中進行排序。在對存儲器訪問進行重新排序的處理器上實現Peterson和相關算法通常需要使用這些操作來正確工作,以保持順序操作不正確的順序發生。請注意,即使對不重新排序指令的處理器(例如Xbox 360中的PowerPC處理器),也可能發生內存訪問的重新排序。
是的,使用系統提供的同步機制(互斥體)而不是重新發明輪子。
0
我認爲你的問題將與不互相排斥,但sycronyzation有關。 Peterson算法僅確保一個進程處於關鍵區域,並且不能確保哪些進程應處於關鍵區域。 如果您提到的問題是正確的,我建議使用Moniter作爲sycronyzing。
0
代碼中應該有一些關鍵部分由進程共享。當你沒有鎖定的情況下運行程序時,輸出將會不同且不明確,因此我們可以驗證你的代碼是否正常工作。
問題是您正在使用print語句,當您刪除它們時,應該有共享的東西。
你能分享你使用的是什麼樣的邏輯來Peterson算法
相關問題
- 1. 在共享內存中鎖定信號量問題
- 2. 鎖定可共享內存
- 3. C內存共享問題
- 4. 共享內存問題
- 5. 共享內存在C:shmget的問題
- 6. 簡單的內存共享問題
- 7. cuda nbody模擬 - 共享內存問題
- 8. 共享內存和memcpy問題
- 9. X平面共享內存問題10
- 10. 使用無鎖算法共享內存
- 11. OpenCL-共享內存訪問
- 12. PlayFramework共享緩存問題
- 13. 在共享內存
- 14. boost.interprocess中共享內存中的memcpy的問題
- 15. 共享內存一致性的鎖定機制
- 16. C多進程訪問共享內存互斥鎖
- 17. 內存共享
- 18. cuda中的共享內存
- 19. OpenCL中的共享內存
- 20. DLL中的共享內存
- 21. 共享內存在Unix的
- 22. 共享問題
- 23. 共享內存:位置和鎖定策略
- 24. 共享內存鎖定和進程崩潰
- 25. 如何解決共享主機中的內存限制問題
- 26. 使用Large_Int訪問共享內存的問題
- 27. System.Data.SQLite鎖定/共享衝突
- 28. 爪哇 - 文件共享文件鎖定問題
- 29. 線程池共享資源鎖定問題
- 30. 在內存中緩存數據共享
我有想過存儲器記錄!無論如何非常感謝。我現在會使用互斥鎖。 – Neal 2011-06-11 21:09:16