Sobes.tech
Middle

Mutex ve semafor ile lock arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

C# dilinde lock, Monitor.Enter ve Monitor.Exit kullanımı için sözdizimi şekeridir ve try-finally bloğu içinde sarılarak kilidin garantili serbest bırakılmasını sağlar. Bu, bir kaynağa yalnızca bir akışın erişimini sağlayan en basit senkronizasyon primitive'idir.

Mutex, bir kaynağa yalnızca bir akışın birden fazla işlemde erişimini sağlamak için kullanılabilen bir senkronizasyon primitive'idir. Akışın mülkiyeti kavramına sahiptir: Mutex'i alan yalnızca o akıştır ve serbest bırakabilir.

Semaphore, aynı anda birden fazla akışın bir kaynağa erişimini sınırlayan bir senkronizasyon primitive'idir. Bir sayaç içerir; erişim alındığında azalır ve serbest bırakıldığında artar.

Ana farklar tablo halinde sunulmuştur:

Özellik lock (Monitor) Mutex Semaphore
Görünürlük alanı Tek bir işlem içinde İşlemler arasında İşlemler arasında
Akış sayısı Sadece biri Sadece biri (sahibi) Sınırlı sayı
Sahiplik Akışa bağlı Akışa bağlı Akışa bağlı değil
Kullanım Basit senkronizasyon İşlemler arası senkronizasyon, isimlendirilmiş mutex'ler Kaynak erişimini sınırlandırma
İstisnalar Açıkça AbandonedMutexException gerekmez AbandonedMutexException gerekebilir AbandonedSemaphoreException yok
// lock kullanımı örneği
private readonly object _lockObject = new object();

public void DoSomethingWithLock()
{
    lock (_lockObject)
    {
        // Kritik bölüm
    }
}

// Mutex kullanımı örneği
using System.Threading;

private Mutex _mutex = new Mutex();

public void DoSomethingWithMutex()
{
    _mutex.WaitOne(); // Mutex al
    try
    {
        // Kritik bölüm
    }
    finally
    {
        _mutex.ReleaseMutex(); // Mutex serbest bırak
    }
}

// Semaphore kullanımı örneği
using System.Threading;

private Semaphore _semaphore = new Semaphore(3, 3); // Aynı anda 3 thread'e izin verir

public void DoSomethingWithSemaphore()
{
    _semaphore.WaitOne(); // "Erişim" semafora alınır
    try
    {
        // Kritik bölüm, 3 thread ile sınırlıdır
    }
    finally
    {
        _semaphore.Release(); // "Erişim" serbest bırakılır
    }
}