2010-09-25 71 views
0

我正在用Boost.Unit編寫單元測試,並且我想在我測試的代碼中包含死鎖的基本測試。我的第一個想法是在一個線程中設置一個截止時間定時器,同時在另一個線程中運行測試,預計在截止日期前完成。當定時器關閉時,斷言該線程沒有運行或不可中斷。我可以通過哪些方式更精確地檢測死鎖?Boost C++庫:單元測試在死鎖上的聲明

回答

3

的一個問題是,你對測試實際死鎖(即看是否死鎖發生)或潛在死鎖(即看是否死鎖可能發生)?

如果你只關心檢測實際的死鎖,那麼你所描述的東西可以工作。但是,我不確定這樣做會有什麼用處,因爲無論您運行多少次測試,如果線程間定時結束,將來總有可能會發生死鎖完全錯誤。這是一個多線程編程與單線程編程不同的領域:在多線程程序中,一次(甚至一百萬次)成功運行程序並不能證明它是正確的。

保證您的代碼不會死鎖的唯一方法是驗證每次線程同時擁有多個鎖時,它們都以相同的順序獲得鎖。最簡單的方法是確保沒有線程一次擁有多個鎖,但這並非總是可行。鑑於此,另一種方法是直接對代碼進行眼球檢查,直至您確信自己的滿意度,即所有情況下都遵循單一鎖定順序。但是這並不總是實際,特別是如果代碼複雜。 (順便說一句,將多線程代碼儘可能簡單地設置爲非常簡單,正是出於這種原因)。

如果目光明亮的代碼是不夠的,你可以做的最後一件事是儀器鎖定採集:最簡單的方法(如果你的代碼可以在Linux下運行)是在helgrind下運行你的代碼。如果你不能這樣做,另一種方法是將你的鎖/解鎖調用包裝在一個函數中,該函數記錄哪個線程正在鎖定/解鎖哪個互斥鎖,然後解析日誌以檢測鎖定順序不一致性「post mortem」 。