我正在用Boost.Unit編寫單元測試,並且我想在我測試的代碼中包含死鎖的基本測試。我的第一個想法是在一個線程中設置一個截止時間定時器,同時在另一個線程中運行測試,預計在截止日期前完成。當定時器關閉時,斷言該線程沒有運行或不可中斷。我可以通過哪些方式更精確地檢測死鎖?Boost C++庫:單元測試在死鎖上的聲明
0
A
回答
3
的一個問題是,你對測試實際死鎖(即看是否死鎖發生)或潛在死鎖(即看是否死鎖可能發生)?
如果你只關心檢測實際的死鎖,那麼你所描述的東西可以工作。但是,我不確定這樣做會有什麼用處,因爲無論您運行多少次測試,如果線程間定時結束,將來總有可能會發生死鎖完全錯誤。這是一個多線程編程與單線程編程不同的領域:在多線程程序中,一次(甚至一百萬次)成功運行程序並不能證明它是正確的。
保證您的代碼不會死鎖的唯一方法是驗證每次線程同時擁有多個鎖時,它們都以相同的順序獲得鎖。最簡單的方法是確保沒有線程一次擁有多個鎖,但這並非總是可行。鑑於此,另一種方法是直接對代碼進行眼球檢查,直至您確信自己的滿意度,即所有情況下都遵循單一鎖定順序。但是這並不總是實際,特別是如果代碼複雜。 (順便說一句,將多線程代碼儘可能簡單地設置爲非常簡單,正是出於這種原因)。
如果目光明亮的代碼是不夠的,你可以做的最後一件事是儀器鎖定採集:最簡單的方法(如果你的代碼可以在Linux下運行)是在helgrind下運行你的代碼。如果你不能這樣做,另一種方法是將你的鎖/解鎖調用包裝在一個函數中,該函數記錄哪個線程正在鎖定/解鎖哪個互斥鎖,然後解析日誌以檢測鎖定順序不一致性「post mortem」 。
相關問題
- 1. x單元測試死鎖
- 2. Boost C++庫:%處理器使用情況下的單元測試聲明
- 3. qt單元測試QTreeWidgetItem尚未聲明
- 4. Python單元測試聲明錯誤
- 5. 與Shouldly聲明單元測試失敗
- 6. Python單元測試條件聲明
- 7. 如何檢測Asio庫的死鎖?
- 8. 單元測試C#雙鎖模式
- 9. 如何測試回撥函數? (C++ Boost單元測試)
- 10. 屬性跳過聲明單元測試C#
- 11. 使用nUnit測試死鎖
- 12. 聲納C單元測試框架
- 13. 在Visual Studio中執行單個Boost測試單元測試
- 14. 如何在Swift單元測試中聲明可選Bool的值?
- 15. 如何在reactjs單元測試中聲明正確的值?
- 16. 聲明在角度單元測試中存在父組件
- 17. 鎖定在單元測試不工作
- 18. 在單元測試中聲明設置和預置條件
- 19. 如何在Groovy單元測試中聲明響應成功
- 20. C#單元測試
- 21. C#單元測試
- 22. C#單元測試
- 23. 單元測試(C#)
- 24. 線程同步(鎖)的單元測試
- 25. 在solaris上的C++的死鎖
- 26. 我可以在Nunit中創建數據庫死鎖測試嗎?
- 27. 單元測試示例證明單元測試值得一寫
- 28. 課堂擴展中聲明的單元測試方法
- 29. .Net MVC中的單元測試聲明應用程序
- 30. C#中的單元測試#