2015-10-12 42 views
0

如何爲多線程生產者 - 消費者C程序編寫好的測試?我知道GDB可以用來調試線程,但我相信GDB也會停止當前正在調試的線程,而其他線程繼續運行。如何編寫多線程生產者 - 消費者C程序的測試?

我想測試適當的互斥鎖/解鎖和我的線程阻塞。我環顧了很多,但一直沒有找到任何好的資源。

我對所有非併發功能都有單元測試,但要確保我的併發性是正確的。如何才能做到這一點?

+3

我不相信有一些通用的解決方案存在。一般而言,您應該對單個線程代碼執行相同的操作,即測試所有組合。可能是如果你發佈具體的小例子,可以找到一個特定案例的答案 – Lol4t0

+1

據我所知,測試併發性是非常棘手的,特別是在千兆赫茲地區運行的現代系統。對於特別小的任何事情,如果你試圖證明算法的正確性*先寫*然後編寫代碼就相對容易一些。我會第二@ Lol4t0因爲這不可能是一個通用的解決方案。 – tonysdg

+1

@tonysdg,我相信正確性的研究算法是一個步驟,但你也必須檢查你的實現是否與你開發的算法一致。 – Lol4t0

回答

0

我相信當其他線程繼續運行時,GDB也會停止當前正在調試的線程。

你的信念是錯誤的:默認情況下,GDB工作在all-stop模式:停止一個線程停止他們所有

較新的GDB版本也有non-stop模式,其中的其他線程繼續運行,但這不是默認模式。

想確保我的併發性是正確的。

它是不可能通過測試證明併發是正確的。你只能通過編寫正確的代碼來做到這一點(並仔細閱讀)。

Clang thread safety analysis可以提供幫助。在thread sanitizer下測試可以提供幫助。 GDB在這裏通常是錯誤的工具。