可能重複:
What are common concurrency pitfalls?開發人員遇到的一些常見陷阱是多線程?
我有螺紋的基本知識,沒有什麼特殊。一些同事和我正在學習認證,我們正在討論關於多線程的章節。
實現多線程應用程序時,您會犯的一些常見錯誤?
在開發多線程應用程序時,是否有任何「陷阱」,我們應該注意?
可能重複:
What are common concurrency pitfalls?開發人員遇到的一些常見陷阱是多線程?
我有螺紋的基本知識,沒有什麼特殊。一些同事和我正在學習認證,我們正在討論關於多線程的章節。
實現多線程應用程序時,您會犯的一些常見錯誤?
在開發多線程應用程序時,是否有任何「陷阱」,我們應該注意?
多線程應用程序的經典難點是兩個不同的線程同時修改相同的內存。解決這個問題的方法叫做同步。
最大陷阱是來自不同線程(併發寫入)
更新數據;即使像i ++這樣簡單的東西並不總是原子的,換句話說,如果兩個線程同時做它,結果可能是i + = 2,或者它可能是i ++(或者它可能完全取決於你使用的語言,重新使用);答案是確保寫入訪問在「互斥」(互斥)鎖上「同步」,以便至多一個線程可以在給定時間寫入該易失性數據塊
死鎖,其中一個線程必須在A上獲得一個互斥量,然後在B上獲得一個互斥量,而另一個線程按照相反的順序獲取互斥量;如果第一個線程得到A,第二個線程得到B,那麼這兩個線程都不能繼續;這裏的答案是確保mutexes以規範的順序獲得
但是最好的建議是KISS,保持它簡單愚蠢。複雜的線程模型非常難以調試。如果可能的話,不要有多個線程進行寫操作,特別是儘量避免多個嵌套互斥鎖(需要A和B都需要執行某些操作)。
另一條建議是使用衆所周知的線程安全數據類型庫,如原子對象和併發映射和隊列。
考慮到未來(雲計算),您可能會考慮編寫應用程序,就好像線程位於不同的機器上一樣,儘可能少地進行交叉通信。
我認爲如果多個領域可以啓動線程,最大的問題就是遺忘,因爲您可能有競爭條件,因爲一個部分可能是同步的,但如果有另一個入口點,您將遇到難以追蹤的問題。
但是,最難的部分是知道何時使用多線程。這對每一種情況都不是完美的。
應該傳入哪些參數,以及如何避免使用全局變量。
我覺得這是好主意,從函數式編程的到來,限制副作用,當你開始學習在很大程度上全局變量可以是壞的,如果他們是由許多不同的線程多變很大。
,當你有多個線程也將是一個挑戰,這取決於你使用的語言,例如,使用UNIX上的C調試調試不好玩,但Visual Studio中更容易。
重複:http://stackoverflow.com/questions/520837/what-are-common-concurrency-pitfalls這 – lothar 2009-06-02 01:51:07
複製? http://stackoverflow.com/questions/520837/what-are-common-concurrency-pitfalls – 2009-06-02 01:51:31