您目前已離線,請等候您的網際網路重新連線

不支援您的瀏覽器

您必須更新瀏覽器,才能使用此網站。

更新至最新版本的 Internet Explorer

競爭情形和死結 (deadlock) 的描述

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:317723
結論
Visual Basic.NET 或 Visual Basic 2005年可讓您可用於 Visual Basic 應用程式中的執行緒,第一次。執行緒會導致偵錯的問題,例如競爭情形和死結 (deadlock)。本文探討這兩個問題。
其他相關資訊

競爭情形

當兩個執行緒同時存取共用的變數時,就會發生競爭情形。第一個執行緒會讀取該變數,並且第二個執行緒讀取相同的值從變數。然後第一個執行緒,第二個執行緒執行的值,其作業和它們競爭,查看哪一個執行緒可以上次寫入值,對共用變數。將其值寫入執行緒的值最後會保留,因為執行緒正在寫入值在上一個執行緒所撰寫。

詳細資訊和範例

每個執行緒會配置一個預先定義的處理器上執行的時間期間。配置執行緒的時間過期時,執行緒的內容時,會儲存到其下一回合上,處理器上,處理器開始下一個執行緒執行。

如何一行命令會造成競爭情形?請檢查下列的範例,以瞭解競爭情形的發生。有兩個執行緒,而且兩者都要更新共用的變數稱為 「(這表示為dword ptr ds: [031B49DCh]組件程式碼中)。

Visual Basic 程式碼:
   'Thread 1   Total = Total + val1				
   'Thread 2   Total = Total - val2				
組件程式碼 (與行號) 從先前的 Visual Basic 程式碼編譯:
 'Thread 1 1.   mov         eax,dword ptr ds:[031B49DCh]  2.   add         eax,edi  3.   jno         00000033  4.   xor         ecx,ecx  5.   call        7611097F  6.   mov         dword ptr ds:[031B49DCh],eax 				
 'Thread 2 1.   mov         eax,dword ptr ds:[031B49DCh]  2.   sub         eax,edi  3.   jno         00000033  4.   xor         ecx,ecx  5.   call        76110BE7  6.   mov         dword ptr ds:[031B49DCh],eax 				
您可以藉由查看組譯程式碼,請參閱多少操作處理器執行在較低的層級執行簡單的加法計算。執行緒可以在其時間處理器上執行它的組件程式碼的全部或部分。現在看看如何競爭情形,將這個程式碼就會發生。

總計是 100,val1 為 50,而 val2 15。執行緒 1 取得有機會執行,但只完成步驟 1 到 3。這表示執行緒 1 讀取該變數,而且完成加入。執行緒 1 現在只等候寫出 150 其新值。執行緒 1 停止之後,執行緒 2 取得完全執行。這表示它已寫入值其值等於 (85) 出變數的總計。最後,執行緒 1 重新取得控制,並執行完畢。它會寫出它的值 (150)。因此,執行緒 1 完成時,總和的值現在是 150,而不是 85。

您可以看到這可能是重大的問題。如果這是銀行程式時,客戶必須金錢在他們不應該出現的帳戶。

這個錯誤是隨機的因為它是執行緒 1 才能完成它的時間之前執行上可能處理器到期時,執行緒 2 可以再開始執行。如果這些事件發生時,它會不會發生這個問題。執行緒的執行是不具決定性的因此您無法控制的時間或執行的順序。也請注意在執行階段與偵錯模式中執行的執行緒可能以不同的方式。此外,您可以看到如果您在數列中執行每個執行緒,沒有發生錯誤。這個隨機性可讓您更難追蹤和偵錯這些錯誤。

為了避免競爭情形發生,您可以鎖定共用的變數,以便一次只有一個執行緒能夠存取共用變數。執行這項操作謹慎,因為執行緒 2 等候執行緒 1 釋放變數時,如果變數鎖定在執行緒 1,執行緒 2 也需要此變數會停止執行緒 2 的執行。(如需詳細資訊,請參閱本文的 〈 參考 〉 一節中的 「 SyncLock")。

徵狀

競爭情形的最常見的徵狀是無法預期的多個執行緒之間共用的變數的值。這導致的順序執行執行緒的不可預測性。有時一個執行緒 wins,和某個其他執行緒 wins。在其他時候,執行會正常運作。此外,如果每個執行緒分開執行,變數的值會正確運作。

死結 (deadlock)

當兩個執行緒每個鎖定不同的變數在同一時間,並嘗試鎖定另一個執行緒已鎖定的變數時,就會發生死結。其結果是,每個執行緒會停止執行,並等待其他執行緒釋放該變數。因為每個執行緒持有另一個執行緒,好像沒有發生事情,想要的變數,而且執行緒保持死結。

詳細資訊和範例

下列程式碼有兩個物件,LeftVal 和 RightVal:
'Thread 1SyncLock LeftVal SyncLock RightVal  'Perform operations on LeftVal and RightVal that require read and write. End SyncLockEnd SyncLock				
'Thread 2SyncLock RightVal SyncLock LeftVal  'Perform operations on RightVal and LeftVal that require read and write. End SyncLockEnd SyncLock				
當執行緒 1 允許鎖定 LeftVal 時,就會發生死結。處理器會停止執行緒 1 執行,並開始執行的執行緒 2。執行緒 2 鎖定 RightVal,然後再嘗試鎖定 LeftVal。因為 LeftVal 已被鎖定,執行緒 2 會停止,並等待釋放的 LeftVal。執行緒 2 已停止,因為執行緒 1 允許繼續執行。執行緒 1 會試著鎖定 RightVal,但不能,因為執行緒 2 已被鎖定。因此,執行緒 1 啟動等到 RightVal 會變成可用。每個執行緒等待另一個執行緒,因為每個執行緒已鎖定正在等候其他執行緒的變數和兩個執行緒會解除鎖定它所持有的變數。

永遠不會發生死結。如果執行緒 1 會執行這兩個鎖定,則處理器會停止它之前,執行緒 1 可以執行其作業,然後解除鎖定共用的變數。執行緒 1 會解除鎖定變數之後,執行緒 2 可以繼續執行,如預期般運作。

這些程式碼片段的程式碼會放在並排顯示,但在練習中,程式碼可能會出現在個別的模組或程式碼的區域時,這項錯誤似乎明顯。這非常重大的錯誤,因為這個相同的程式碼,正確執行和不正確的執行可能會發生追蹤。

徵狀

常見徵兆是死結的程式或執行緒的群組會停止回應。這也稱為是停止回應。至少兩個執行緒在等候其他執行緒鎖定的變數。執行緒請勿處理,因為兩個執行緒會釋放其變數,直到它取得其他變數。如果程式正在等候一或兩個那些執行緒以完成執行,可以停止回應整個程式。

何謂往來文章?

處理程序用來分隔不同的單一電腦上的指定時間執行的應用程式。作業系統將不會執行處理程序,但執行緒。執行緒是執行單位。作業系統會配置執行緒的處理器時間執行的執行緒的工作。單一的處理程序可以包含多個執行緒的執行。每個執行緒都維護它自己的例外狀況處理常式,排程優先順序,以及一組作業系統用來儲存執行緒的內容,如果執行緒無法完成傳遞給處理器的時間內執行的結構。內容會保留到下次執行緒接收處理器時間。內容包含執行緒需要完美地繼續執行的所有資訊。此資訊包括執行緒的一組處理器暫存器和主機處理序的位址空間內的呼叫堆疊。
参考
如需詳細資訊,搜尋 Visual Studio 說明下列關鍵字:
  • SyncLock.允許物件被鎖定。如果另一個執行緒都嘗試鎖定該相同的物件,它會封鎖直到第一個執行緒釋放。使用 SyncLock 特別小心,因為問題可能起因於 SyncLock 誤用。例如,這個命令可以避免競爭情形,但是會造成死結。
  • 連鎖.可允許所選取的基本數字變數上的安全執行緒的作業。
如需更多詳細資訊,請按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的文件:
316422 對於執行緒在 Visual Basic.NET 中的資訊: 藍圖
如需詳細資訊,請參閱下列 MSDN 網站:

警告:本文為自動翻譯

內容

文章識別碼:317723 - 最後檢閱時間:10/29/2013 02:42:00 - 修訂: 3.0

  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtzh
意見反應