2009-06-02 44 views
0

可能重複:
What are common concurrency pitfalls?開發人員遇到的一些常見陷阱是多線程?

我有螺紋的基本知識,沒有什麼特殊。一些同事和我正在學習認證,我們正在討論關於多線程的章節。

實現多線程應用程序時,您會犯的一些常見錯誤?

在開發多線程應用程序時,是否有任何「陷阱」,我們應該注意?

+1

重複:http://stackoverflow.com/questions/520837/what-are-common-concurrency-pitfalls這 – lothar 2009-06-02 01:51:07

+2

複製? http://stackoverflow.com/questions/520837/what-are-common-concurrency-pitfalls – 2009-06-02 01:51:31

回答

1

多線程應用程序的經典難點是兩個不同的線程同時修改相同的內存。解決這個問題的方法叫做同步。

See my more complete answer here

0

最大陷阱是來自不同線程(併發寫入)

  • 更新數據;即使像i ++這樣簡單的東西並不總是原子的,換句話說,如果兩個線程同時做它,結果可能是i + = 2,或者它可能是i ++(或者它可能完全取決於你使用的語言,重新使用);答案是確保寫入訪問在「互斥」(互斥)鎖上「同步」,以便至多一個線程可以在給定時間寫入該易失性數據塊

  • 死鎖,其中一個線程必須在A上獲得一個互斥量,然後在B上獲得一個互斥量,而另一個線程按照相反的順序獲取互斥量;如果第一個線程得到A,第二個線程得到B,那麼這兩個線程都不能繼續;這裏的答案是確保mutexes以規範的順序獲得

但是最好的建議是KISS,保持它簡單愚蠢。複雜的線程模型非常難以調試。如果可能的話,不要有多個線程進行寫操作,特別是儘量避免多個嵌套互斥鎖(需要A和B都需要執行某些操作)。

另一條建議是使用衆所周知的線程安全數據類型庫,如原子對象和併發映射和隊列。

考慮到未來(雲計算),您可能會考慮編寫應用程序,就好像線程位於不同的機器上一樣,儘可能少地進行交叉通信。

0

我認爲如果多個領域可以啓動線程,最大的問題就是遺忘,因爲您可能有競爭條件,因爲一個部分可能是同步的,但如果有另一個入口點,您將遇到難以追蹤的問題。

但是,最難的部分是知道何時使用多線程。這對每一種情況都不是完美的。

應該傳入哪些參數,以及如何避免使用全局變量。

我覺得這是好主意,從函數式編程的到來,限制副作用,當你開始學習在很大程度上全局變量可以是壞的,如果他們是由許多不同的線程多變很大。

,當你有多個線程也將是一個挑戰,這取決於你使用的語言,例如,使用UNIX上的C調試調試不好玩,但Visual Studio中更容易。