2009-06-25 76 views
4

爲避免死鎖,有人應遵循哪些最佳實踐/成語?避免多線程進程中的死鎖

+0

[死鎖的常見原因是什麼?]可能的重複(http://stackoverflow.com/questions/528303/what-are-common-reasons-for-deadlocks) – 2017-03-21 11:19:01

回答

1

爲避免死鎖的典型技術是有鎖的層次結構。確保所有線程以相同的順序獲取鎖或其他資源。這可以避免線程1持有鎖A並需要鎖B,而線程2持有鎖B並需要鎖A的死鎖情形。對於鎖層次結構,兩個線程都必須以相同的順序獲取鎖(例如,B之前的A) 。

1

所謂的Banker's algorithm,爲了避免死鎖。你也可以考慮使用Watch Dog以打破形式僵局。 Here也很少有趣的一點。

+0

爲什麼沒有Upvote這個本質! – 8090PZ 2014-11-16 21:28:51

0

最好的做法是爲你的線程定義一個類,並且只在你的線程中使用這個類的非靜態字段,這樣你的線程就不會共享任何內存。
當然,爲避免死鎖,您還可以避免使用信號量,臨界區和互斥量。如果你想避免死鎖,則越少越好。不幸的是,如果某些內存或其他資源在兩個線程之間共享,則可能需要這些資源,否則可能會導致數據損壞。

6

four conditions發生必須發生死鎖:

  1. 互斥條件:不能由多個進程同時

  2. 保留使用,並等待條件的資源:流程已經持有的資源可以請求新的資源

  3. 無搶佔條件:沒有資源可以從過程拿着它強行拆除,資源只能由電子發佈該方法的xplicit動作

  4. 循環等待條件:兩個或多個進程形成,其中每個處理等待,在鏈中的下一個進程持有

避免它們中的至少一個的資源的循環鏈,最好是更多,而且你不應該有太多問題。

-1

在進入關鍵部分的各種方法中 - 信號量和互斥量是最受歡迎的。

  • 旗號是等待機構和互斥鎖定機制,以及這個概念是混亂的最大,但總之,一個線程激活一個互斥體只能將其停用。考慮到這一點......

  • 不要讓任何進程鎖定資源的部分沒有,如果一個進程需要5個資源,等到所有的都可以。

  • 如果你在這裏使用信號量,你可以解鎖/取消等待其他線程佔用的資源。通過這個我的意思是先佔是另一個原因。

這2個根據我是基本情況,其餘2個常見的4個注意事項都可以與這些有關。

如果你不同意ps添加評論。我已經遲到了,我會在稍後添加一個更清晰和更清晰的解釋。