當多個執行緒在共用變數的時候,首要小心遇到死結問題,基本發生原因為其一執行緒Lock住變數,導致其他執行緒無窮境的等待,想起來似乎不容易發生,確實當整個程式只共用一組變數,這種問題很容易避免,但若在同一時間內到兩個以上的變數,這種死結是很容易發生的,以下簡單的範例 。

範例:

下兩個執行緒的程式碼,其中含有兩個將共用的物件 Object_A 和 Object_B:

 

Thread 1

 ..
SyncLock Object_A
 
dim ..... 
  for.....
  ....
  Object_A = ....
  Next ...
  SyncLock Object_B         
     Object_B = ....
  End SyncLock ..
  Object_A = ...

End SyncLock

..
..

'Thread 2

..
SyncLock Object_B
  if ....
  dim...
  ... = Object_B...
  ...
  ...
  SyncLock Object_A  
    Object_A = .....
  End SyncLock
   ..
  Object_B =

End SyncLock

..
.. 

以上範例便是最標準的死結程式片段。簡單說明:當Thread 1開始執行到SyncLock Object_A,若Thread 2不巧也執行到SyncLock Object_B,便會導致Thread 1程式執行至SyncLock Object_B時等待Thread 2釋放Object_B;而Thread 2也因為Thread 1 Lock住Object_A而當執行到SyncLock Object_A時等待Thread 1釋放Object_A。兩個執行緒便在此鎖死。

單一變數的共用確實沒什麼困難,不太容易發生死結問題,共用時只要記得在SyncLock內不放置無窮回圈即可避免。但在共用兩變數以上巢狀的SyncLock時,依順序的SyncLock是必要的,只要不依順序,就有可能發生如範例中的死結。

以上的例子,應該將Thread 2 的SyncLock Object_A搬移至SyncLock Object_B之前,如此便可避免死結問題。

創作者介紹

傑克鼠的下午茶

傑克鼠 發表在 痞客邦 PIXNET 留言(1) 人氣()


留言列表 (1)

發表留言
  • John
  • 正巧在尋找Deadlock的原因和文章,您這篇文章淺顯易懂,能否讓我引用?
  • 喔喔當然可以~

    傑克鼠 於 2008/12/23 16:35 回覆