2015-10-20 44 views
1

考慮一些Mutex類實現的測試用例。測試在執行期間創建了幾個std :: thread實例。如果根據測試正確實施Mutex類,則所有線程都應該完成。如果出現問題,則可能一個線程可能無限期地被阻塞。測試如何正確清理後自己?在自動測試後安全地清理阻塞std :: thread

起初我以爲分離線程,但隨後線程泄漏。更糟糕的是,線程依賴於測試用例內部的Mutex實例,在測試用例返回後偶爾會導致訪問衝突。有些線程庫在Qt的QThread中有terminate()方法,但是我想使用std :: thread,即使Qt已經是我的項目的依賴項了。

是否存在測試潛在無限期阻塞併發代碼的一般模式?

回答

0

殺死可能存在鎖定的線程是強制終止線程的主要原因之一,也是爲什麼C++ 11不支持它。你不應該這樣做,這段時間。

如果你需要做這樣的事情,你最好的最好的可能是產生一個新的進程來運行測試;如果它鎖定了,你可以在沒有相同風險的情況下終止這個過程。

有關終止線程爲什麼是壞消息的示例,請查看specific example from the Old New Thing on what sort of garbage thread termination leaves lying around on Windows;大多數操作系統在不同的環境下都會出現類似的問題。

-2

我認爲析構函數可以在這裏得到幫助,是唯一100%確定在任何問題之後執行的設計。在離開它之前,我建議在某個析構函數內部進行一個很好的阻塞測試,並在SECURE WAY(智能指針?)中釋放資源。

+1

析構函數如何包裝測試方法來解決問題?如果std :: thread實例的析構函數在這個包裝析構函數中運行,那麼你仍然有一個銷燬正在運行的std :: thread的問題,導致你的整個應用程序被終止(崩潰)。 –

+0

我在線程實例的析構函數中沒有想到,可能是任何可以訪問線程處理函數的析構函數(在最糟糕的情況下都是這樣),這個問題的解決方案是收斂的(在我見過的實現的90%中)使用專用進程檢查線程中的問題,因爲之前的ShadowRanger註釋可以使用該析構函數進行特別的測試,而不是在析構函數中運行進程。 http://stackoverflow.com/questions/29178435/safely-destroying-a-thread-pool?rq=1 檢查這一點,它是不一樣的,但會有所幫助。 –