Sobes.tech
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: lock en 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 Interlocked sı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);
}