簡體   English   中英

自動測試后安全清理阻塞的std :: thread

[英]Safely cleaning up a blocking std::thread after an automated test

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

起初我以為是要拆線的,但后來卻泄漏了。 更糟糕的是,線程依賴於測試用例內部的Mutex實例,這將在測試用例返回后偶爾導致訪問沖突。 Qt的QThread之類的某些線程庫具有Terminate()方法,但是我想使用std :: thread,即使Qt已經是我項目的依賴項。

是否有用於測試可能無限期阻塞並發代碼的通用模式?

殺死可能持有鎖的線程是強行終止線程的原因之一,也是為什么C ++ 11不支持它。 期間,您不應該這樣做。

如果您需要執行類似的操作,則最好的辦法可能是產生一個新的過程來運行測試。 如果鎖定,則可以終止該過程而沒有相同的風險。

有關為什么終止線程是個壞消息的示例,請參閱Old New Thing上特定示例,該示例演示了Windows上會留下什么樣的垃圾線程終止 在大多數情況下,不同的操作系統上也會發生類似的問題。

我認為析構函數可以在這里提供幫助,這是唯一有辦法在設計出問題后100%執行的事情。 我建議在某些析構函數內部進行一次不錯的阻塞測試,並在離開之前以安全方式釋放資源(智能指針?)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM