當多個執行緒在共用變數的時候,首要小心遇到死結問題,基本發生原因為其一執行緒Lock住變數,導致其他執行緒無窮境的等待,想起來似乎不容易發生,確實當整個程式只共用一組變數,這種問題很容易避免,但若在同一時間內到兩個以上的變數,這種死結是很容易發生的,以下簡單的範例 。
範例:
下兩個執行緒的程式碼,其中含有兩個將共用的物件 Object_A 和 Object_B:
Thread 1 |
'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之前,如此便可避免死結問題。
留言列表