Middle+
Birden fazla iş parçacığı (threads) ve görevlerin (tasks) ortak bir duruma eriştiği durumlarda nasıl çalışılır?
sobes.tech yapay zeka
AI'dan gelen yanıt
Çok iş parçacıklı ortamda ortak duruma güvenli erişim, senkronizasyon mekanizmaları kullanılarak sağlanır.
Ana yaklaşımlar:
- Kilitlemeler:
locken yaygın mekanizmadır. Bir kod bloğuna veya nesneye tek seferde bir iş parçacığının erişimini sağlar. Mutex (karşılıklı dışlama) de kullanılır, ancak genellikle süreçler arası iletişimde tercih edilir. - Semantikalar: Aynı anda bir kaynağa erişebilecek iş parçacığı sayısını sınırlar.
- Monitor:
lock'un daha güçlü bir versiyonudur ve iş parçacıklarının diğerlerinden bildirim beklemesine izin verir. - ReadWriteLock: Birden fazla iş parçacığının verileri eşzamanlı okuyabilmesine, ancak yalnızca birinin yazabilmesine olanak tanır.
- Atomik işlemler: Basit işlemler (arttırma, azaltma, karşılaştırma-değiştirme) için
Interlockedsınıfının statik metodları kullanılabilir.
Tasks ile çalışırken, özellikle async/await kullanıldığında, görevlerin belirli bir iş parçacığıyla bağlı olmadığını unutmamak önemlidir. Senkronizasyon bağlamları (SynchronizationContext), asenkron işlemin tamamlanmasından sonra istenen bağlama (örneğin, UI iş parçacığı) geri dönmeye yardımcı olur.
lock kullanımına örnek:
// Kilitleme nesnesi
private readonly object _lockObject = new object();
private int _sharedCounter = 0;
public void IncrementCounter()
{
// Ortak sayacı kilitler
lock (_lockObject)
{
_sharedCounter++;
}
}
Interlocked kullanımı örneği:
private int _sharedAtomicCounter = 0;
public void IncrementAtomicCounter()
{
// Atomik artış
Interlocked.Increment(ref _sharedAtomicCounter);
}