Makale numarası: 317723 - Son Gözden Geçirme: 06 Aralık 2006 Çarşamba - Gözden geçirme: 2.3

Yarış durumları ve kilitlenmeleri açıklaması

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Visual Basic .NET veya Visual Basic 2005 iş parçacıkları Visual Basic uygulamalarının ilk kez kullanma olanağı sunar. Iş parçacığı, hata ayıklama sorunları yarış durumları ve kilitlenmeleri sunar. Bu makalede, bu iki sorunları inceler.

Daha fazla bilgi

Yarış koşulları

Paylaşılan bir değişken aynı anda iki iş parçacığı eriştiğinizde, BIR yarış durumu oluşur. Ilk iş parçacığının değişken okur ve ikinci iş parçacığının aynı değeri değişken okur. Sonra ilk iş parçacığı ve ikinci iş parçacığı değeri, işlemleri gerçekleştirmek ve bunların hangi iş parçacığının değeri son paylaşılan değişkenine yazabilirsiniz Bkz: durumunu. Iş parçacığı üzerinde değer önceki iş parçacığının programı yazdı yazmak için değeri değerini yazar iş parçacığının son, korunur.

Ayrıntılar ve örneği

Her iş parçacığı, bir zaman bir işlemci, önceden belirlenmiş bir dönem tahsis edilir. Iş parçacığı için tahsis edilen süre sona erdiğinde iş parçacığının içeriğini işlemcisini kadar bir sonraki kapatma kaydedilir ve yürütme sonraki iş parçacığının işlemci başlar.

Nasıl tek satırlık bir komut bir yarış durumu neden olabilir mi? Aşağıdaki örnek, bir yarış durumu, teslimin nasıl görmek için inceleyin. Iki iş parçacığı vardır ve her ikisi de, Toplam adlı paylaşılan bir değişken Güncelleştirmekte olduğunuz (olarak ifade edildiği dword ptr ds: [031B49DCh] derleme kodu).

Visual Basic kodu:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
derleme kodundan (satır numaralarıyla) önceki Visual Basic kodunun derleme:
 '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 
				
derleme kodu arama göre kaç operasyonları görebilirsiniz işlemci basit toplama hesaplama yürütmek için alt düzeyde gerçekleştiriyor. Bir iş parçacığı, işlemci süresi sırasında derleme kodunun bir bölümünü veya tümünü çalıştırmak mümkün olabilir. Şimdi bu koddan nasıl bir yarış durumu oluşur adresindeki bakın.

Toplam 100, değer1 50'dir; değer2 15'tir. Önceden 1 numaralı olan iş parçacığı yürütme olanağı alır, ancak yalnızca 1-3 arasındaki adımları tamamlar. Bu, 1 iş parçacığı değişken okuyun ve ek tamamlandı anlamına gelir. Önceden 1 numaralı olan iş parçacığı şimdi yalnızca yeni 150 değerini dışında yazmak için bekliyor demektir. 1 Iş parçacığı durdurulduktan sonra tamamen yürütme iş parçacığı 2 alır. Bu, onu (85) öğrenmek için değişken toplam hesaplanan, değer yazdığını anlamına gelir. Son olarak, 1 iş parçacığı denetimi regains ve yürütme tamamlanır. Bunu, kendi değerini (150) yazar. 1 Iş parçacığı sona erdiğinde, bu nedenle, toplam değeri yerine, 85 150 sunulmuştur.

Bu nasıl olabilir Bkz: önemli sorun. Bu bankacılık bir program varsa, müşteri, para var olmamalı, hesabında gerekir.

Bu hata rasgele, 1, süre önce yürütme, üzerinde tamamlamak iş parçacığı için olası olduğundan işlemci süresi doluyor. ve 2 iş parçacığı, yürütme sonra başlayabilir. Bu olaylar) oluşursa, sorun ortaya çıkmaz. Iş parçacığı yürütmeyi nondeterministic; bu nedenle zaman veya yürütme sırasını denetleyemezsiniz. Ayrıca, çalışma zamanında hata ayıklama modu ve iş parçacıklarını farklı execute unutmayın. Ayrıca, serideki her iş parçacığı yürütme, hata oluşmaz olduğunu görebilirsiniz. Bu rastgelelik bu hataları çok izlemek ve hata ayıklama zorlaştırır.

Yarış durumları oluşmasını engellemek için <a0></a0>, böylece bir kerede yalnızca bir iş parçacığının paylaşılan değişkenine erişim paylaşılan değişkenleri kilitleyebilirsiniz. Değişken 1 iş parçacığı kilitlendi ve iş parçacığı 2'değişkeni de gerekir, vermiyor Thread 2 yürütme iş parçacığı değişken serbest bırakmak için 1 iş parçacığı 2 bekleyeceği çünkü gelişigüzel, bunu. (Daha fazla bilgi için bu makalenin "Başvurular" bölümünde "SyncLock" konusuna bakın.)

Belirtiler

Bir yarış durumu en genel bir belirtisi, öngörülemeyen değerlerini birden çok iş parçacığı arasında paylaşılan olur. Bu, iş parçacıkları yürütme siparişinin unpredictability olur. Bir iş parçacığının wins bir tarihtir; bir tarihtir iş parçacığı wins. Diğer zamanlarda, yürütme düzgün çalışır. Ayrıca, her iş parçacığı ayrı ayrı çalıştırılır, değişken değeri doğru şekilde davranır.

Kilitlenmeler

Iki iş parçacıklarını her aynı anda farklı bir değişken kilitlemek ve diğer iş parçacığı zaten kilitli değişken kilitlenemiyor deneyin BIR kilitlenme oluşur. Sonuç olarak, her iş parçacığı yürütme durdurur ve diğer iş değişken yayımlamayı bekler. Çünkü hiçbir şey olmuyor, diğer iş parçacığının istediği değişken basılı tutarak her iş parçacığı ve iş parçacıklarını deadlocked kalır.

Ayrıntılar ve örneği

Aşağıdaki kod LeftVal ve RightVal iki nesne vardır:
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
1 iş parçacığı LeftVal kilitlemek için izin verilen BIR kilitlenme oluşur. Işlemci, iş parçacığı 1 yürütme durdurur ve yürütme iş parçacığı 2 başlar. Iş parçacığı 2 kilitlerin RightVal ve LeftVal kilitlemek için çalışır. LeftVal kilitli olduğundan, iş parçacığı 2 durdurur ve yayımlanacak LeftVal için bekler. %2 Iş parçacığı durduruldu çünkü 1 iş parçacığı yürütme devam etmek için izin verilir. Önceden 1 numaralı olan iş parçacığı RightVal kilitlenemiyor çalışır, ancak iş parçacığı 2 kilitlediğinden, edemiyor. Sonuç olarak, iş parçacığı 1 RightVal kullanılabilir hale gelinceye kadar beklemeniz başlar. Her iş parçacığı, başka iş parçacığı bekleyen değişken kilitlediğinden, diğer iş parçacığı için her iş parçacığı bekler ve her iki iş parçacığının basılı değişken kilit.

Her zaman BIR kilitlenme oluşmaz. Işlemci, durdurmadan önce her iki kilitlerin 1 iş parçacığı yürütür, 1 iş parçacığı, işlemleri ve sonra paylaşılan değişken kilidini açın. 1 Iş parçacığı değişken kilidini açar sonra iş parçacığı 2 ile yürütme, beklendiği gibi devam edebilirsiniz.

Bu hata, bu kod parçacıkları yan yana yerleştirilir, ancak bu uygulamada, ayrı bir modül veya alan kodunuzu kodu görünebilir uygun görünmektedir. Bu aynı bu koddan doğru yürütme hem de yanlış yürütme ortaya çıkabileceğinden, izlemek için bir çok hata.

Belirtiler

Kilitlenme genel bir belirtisi bir program veya iş parçacığı grubu vermiyor ' dir. Bu da bir bağlantıyı denir. Her bekleyen diğer iş parçacığının kilitleyen bir değişken için en az iki iş parçacığı var. Diğer değişkenin alır kadar hiçbir iş parçacığı, değişkeni yayımlayacaktır için iş parçacıkları, devam etmeyin. Program, biri veya her ikisi de tam yürütme için bu iş parçacığı üzerinde bekliyorsa tüm program askıda kalma.

Bir iş parçacığı nedir?

Işlemler, belirtilen bir zamanda tek bir bilgisayarda yürütülmesini farklı uygulamaları ayırmak için kullanılır. Işletim sistemi işlemleri yürütmek, ancak iş parçacığı yapın. Bir iş parçacığı yürütme birimidir. Işletim sistemi için bir iş parçacığının işlemci zamanı iş parçacığının görevleri yürütülmesi için ayırır. Tek BIR işlem birden çok iş parçacığının yürütülmesinin içerebilir. Her iş parçacığı zamanlama önceliklerini ve bir iş parçacığının işlemci için atanmış olan süre boyunca, yürütme tamamlayamazsanız iş parçacığının içeriğini kaydetmek için işletim sisteminin kullandığı yapıları, kendi özel durum işleyicileri korur. Içerik, iş parçacığının işlemci zamanını almasını açana kadar tutulur. Içerik için sorunsuz kendi yürütülmesine devam etmek için iş parçacığı gerektiren tüm bilgileri içerir. Bu bilgiler iş parçacığının işlemci yazmaçların ve ana bilgisayar işlemi <a1>Adres</a1> alanı içinde çağrı yığınını içerir.

Referanslar

Daha fazla bilgi için aşağıdaki anahtar sözcükler için Visual Studio Yardımı ara:
  • SyncLock. Nesneyi kilitlenmesine olanak sağlar. Başka bir iş parçacığı, aynı nesne kilitlenemiyor çalışırsa, bunun ilk iş parçacığının bırakmadan engellendi. Sorunları SyncLock kötüye kullanma sağladığından SyncLock dikkatle, kullanın. Örneğin, bu komut yarış durumları engellemek ancak kilitlenmeleri neden.
  • InterLocked. Iş parçacığı için güvenli işlemler temel sayısal bir değişken seçin kümesi sağlar.
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
316422  (http://support.microsoft.com/kb/316422/EN-US/ ) BILGI: Visual Basic. NET'te iş parçacığı için yol haritası
Daha fazla bilgi için aşağıdaki MSDN Web sitesine bakın:
Threads and Threading (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthreadsthreading.asp)

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Anahtar Kelimeler: 
kbmt kbvs2005swept kbvs2005applies kbinfo KB317723 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:317723  (http://support.microsoft.com/kb/317723/en-us/ )