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
}
}