2011-02-07 61 views
3

測試併發數據結構以確保數據結構在從多個線程訪問時行爲正確的方法有哪些?測試併發數據結構

+0

使用其他人爲您驗證過的圖書館? – 2011-02-07 21:29:43

+0

[單元測試實時/併發軟件]可能的重複(http://stackoverflow.com/questions/1733484/unit-testing-real-time-concurrent-software) – 2011-02-07 21:34:48

+0

更多考生:[多線程代碼測試指南或確保代碼是線程安全的](http://stackoverflow.com/questions/4444452/guidelines-for-testing-multithreaded-code-or-ensuring-that-c​​ode-is-thread-safe)和[Unit Testing Concurrent代碼](http://stackoverflow.com/questions/2035890/unit-testing-concurrent-code)。這些全部位於右側的* Related *列表中。 – 2011-02-07 21:36:15

回答

0

所有其他的答案都集中在通過把它通過其步伐實際測試代碼,實際上是在這種或那種形式運行,或禮貌地說:「不要自己動手,使用現有的圖書館」。

這是偉大的和所有,但IMO,最重要的(實際測試也很重要)測試是看線代碼和代碼問「如果我被打斷另一個線程在這裏?「設想另一個線程,在這個中斷期間運行其他任何線路/功能。事情仍然保持一致嗎?競爭資源時,其他線程是否阻塞或旋轉?

這是我們在學習併發性時所做的工作,它是一種令人驚訝的有效方法。最重要的是,我覺得花時間向自己證明事情是一致的,並且在所有州都按照預期工作,這是你在處理這些事情時應該使用的第一種技巧。

1

我通常由插嘴在分佈式線程/進程的適當位置sleep()調用test這類事情。

例如,測試一個鎖,把所有的線程sleep(2)在爭論的焦點,和產卵兩個線程大致間隔1秒。第一個應該獲得鎖定,第二個應該等待。

大多數競態條件可以通過擴展這種方法測試,但如果你的系統有太多的部件可能很難或不可能知道需要測試每種可能的情況。

0

運行您的併發線程一個或幾天,看看會發生什麼。 (聽起來很奇怪,但找出競爭條件是一個如此複雜的話題,只是嘗試它是最好的方法)。

0

併發系統是概率性的,錯誤往往難以複製。因此,您需要運行各種輸入/輸出案例,每個案例都經過一段時間(小時,幾天等)的測試,以檢測可能的錯誤。

併發數據結構的測試涉及在預期事件(如插入和刪除)之前和之後檢查容器的狀態。

1

如果可能,請使用預先存在的,預先測試過的庫,以滿足您的需求。

確保代碼中有適當的自我一致性檢查(最好是快速完整性檢查),並在許多不同類型的硬件儘可能的運行您的代碼,以幫助縮小有趣的時序問題。

有多人同行審查代碼,最好沒有預先解釋它應該如何工作。這樣他們不得不挖掘代碼,這應該有助於捕獲更多的錯誤。

設置一堆線程,除了對數據結構進行隨機操作之外什麼都不做,並且以某種速度檢查一致性。

1

開始與您的訪問電話/修改數據不是線程安全的,並使用鎖,以確保只有一個線程可以訪問/在同一時間修改數據的任何部分的假設。只有在您能夠證明特定類型的訪問在多個線程同時在鎖之外安全的情況下,您才能將該代碼移出鎖。

假設最壞的情況,例如您的代碼會在某些指針操作或另一個關鍵點中停止,並且另一個線程將在中間轉換中遇到該數據。如果這樣做會有不好的結果,請將其放在鎖內。