Aracılığıyla paylaş


Thread-Safe bileşenleri

İş parçacıkları arasında kaynak paylaşımı, çok iş parçacıklı programlama içinde sık sık bir zorunluluktur.Birden çok iş parçacığı paylaşılan bir veritabanı örneğinin erişmek veya sistem değişkenleri kümesine güncelleştirme yapmak gerekebilir.O sırada ne zaman birden fazla iş parçacığı aynı anda değiştiriyorsa olasılığını, paylaşılan kaynaklara erişmek için bir yarış oluşur.Bir iş parçacığı geçersiz duruma kaynak değiştirir ve daha sonra bu kaynağa erişmek ve geçersiz bir durumda kullanmak başka bir iş parçacığı çalışır bir yarış durumu bulunmaktadır.Aşağıdaki örneği inceleyin:

Public Class WidgetManipulator
Public TotalWidgets as Integer = 0
Public Sub AddWidget()
   TotalWidgets += 1
   Console.WriteLine("Total widgets = " & TotalWidgets.ToString)
End Sub
Public Sub RemoveWidgets()
   TotalWidgets -= 10
End Sub
End Class
public class WidgetManipulator
{
   public int TotalWidgets = 0;
   public void AddWidget()
   {
      TotalWidgets++;
      Console.WriteLine("Total widgets = " + TotalWidgets.ToString());
   }
   public void RemoveWidgets()
   {
      TotalWidgets -= 10;
   }
}

Bu sınıf için iki yöntem sunar.Bir yöntemi, AddWidget, 1'e ekler TotalWidgets alan ve değerini konsola yazan.İkinci yöntem 10 değerinden çıkarır TotalWidgets.Ne happen iş parçacıkları aynı anda iki denemesi aynı örneğini erişmek göz önünde WidgetManipulator sınıfı.Bir iş parçacığı çağrısı AddWidget olarak adlandırılan ikinci iş parçacığı aynı anda RemoveWidgets.Bu durumda, değeri TotalWidgets ikinci iş parçacığı tarafından doğru bir değer ilk iş parçacığı tarafından raporlanabilir önce değişti.Bu yarış durumu, bildirilecek yanlış sonuçlara neden olabilir ve veri bozulmasına neden olabilir.

Yarış kilitler kullanarak önleme

Kodunuzu önemli bölümlerin yarış durumundan kullanarak Koruyabileceğiniz kilitleri.Visual Basic anahtar sözcüğü tarafından temsil edilen kilit, SyncLock'deyimi, ya da C# anahtar sözcük lock deyimi, tek bir nesne üzerinde özel yürütme hakları elde etmek için yürütme iş parçacığı sağlar.Aşağıdaki örnekte kilitler gösterilmiştir:

SyncLock MyObject
' Insert code that affects MyObject.
End SyncLock
lock(MyObject)
{
   // Insert code that affects MyObject.
}

Ne zaman bir kilit karşılaştı, belirtilen nesne üzerinde yürütme (MyObject önceki örnekteki) iş parçacığı özel nesneye erişebilir kadar engellenir.Kilit sonuna ulaşıldığında kilidi serbest ve yürütme normal şekilde devam eder.Yalnızca bir başvuru verir bir nesne üzerinde bir kilit elde edebilirsiniz.Bu şekilde bir değer türü kilitlenemez.

a8544e2s.collapse_all(tr-tr,VS.110).gifKilitleri dezavantajları

Kilitleri kullanarak çoklu iş parçacıklarını eşzamanlı olarak bir nesne erimeyen garanti olsa da, önemli performans düşmesine neden olabilir.Bir program çalıştıran birçok farklı iş parçacıklarının ile düşünün.Her iş parçacığı belirli bir nesne kullanması gereken ve yürütmeden önce söz konusu nesne üzerinde kilit almak için beklemek zorunda, iş parçacığı tüm yürütme sonu ve birbirine, performansının düşük olmasına neden olan yedekleme.Bir birim olarak yürütülen kod varsa, bu nedenlerden dolayı yalnızca kilitler kullanmalısınız.Örneğin, bağımlı birden fazla kaynak güncelleştirin.Bu tür kod kabul edilir Atomik.Bilgisayarınızı kilitler atomically yürütülen kod kısıtlama yine de iyi bir performans korurken, verilerinizin güvenliğini sağlamak çok iş parçacıklı bileşenler yazma izin verir.

Ayrıca durumları önlemek dikkatli olmalıdır nerede kilitlenmeleri ortaya çıkabilir.Bu durumda, birden çok iş parçacığı birbirlerine paylaşılan kaynakları serbest bırakmak bekleyin.Örneğin, iş parçacığı 1 a kaynak kilit tutabilir ve kaynak b. bekleniyorİş parçacığı 2, diğer taraftan b kaynak kilit olabilir ve kaynak a. beklerBöyle bir durumda ne iş parçacığı devam etmek için izin verilir.Çıkmaz durumları önlemek için tek yolu üzerinden dikkatli programlama.

Ayrıca bkz.

Görevler

Nasıl yapılır: birden çok iş parçacığı yürütme eşgüdümlemek

Nasıl yapılır: iş parçacığı denetimlerden işlemek

İzlenecek yol: Visual Basic ile basit bir çok iş parçacıklı bileşen geliştirme

İzlenecek yol: Visual C# ile basit bir çok iş parçacıklı bileşen geliştirme

Başvuru

BackgroundWorker

Kavramlar

Olay tabanlı zaman uyumsuz desen genel bakış

Diğer Kaynaklar

Çoklu kullanım bileşenleri