Middle
V čem se liší mutex a semafor od locku?
sobes.tech AI
Odpověď od AI
lock v C# je syntaktický cukr pro použití Monitor.Enter a Monitor.Exit, zabalených v blok try-finally, aby bylo zajištěno uvolnění zámku. Poskytuje exkluzivní přístup k prostředku pro jeden vlákno. V podstatě je to nejjednodušší primitiv synchronizace na úrovni objektu.
Mutex je primitiv synchronizace, který lze použít k zajištění exkluzivního přístupu k prostředku pro jedno vlákno mezi více procesy. Má pojem vlastnictví vlákna: pouze vlákno, které získalo mutex, ho může uvolnit.
Semaphore je primitiv synchronizace, který omezuje počet vláken, která mohou současně získat přístup k prostředku. Má čítač, který se snižuje při získání přístupu a zvyšuje při jeho uvolnění.
Hlavní rozdíly jsou uvedeny v tabulce:
| Charakteristika | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Rozsah viditelnosti | Uvnitř jednoho procesu | Mezi procesy | Mezi procesy |
| Počet vláken | Pouze jedno | Pouze jedno (vlastník) | Omezený počet |
| Vlastnictví | Vázáno na vlákno | Vázáno na vlákno | Není vázáno na vlákno |
| Použití | Jednoduchá synchronizace | Synchronizace mezi procesy, pojmenované mutexy | Omezení paralelního přístupu k prostředku |
| Výjimky | Nevyžaduje explicitní zpracování AbandonedMutexException | Vyžaduje zpracování AbandonedMutexException | Neexistuje AbandonedSemaphoreException |
// Příklad použití lock
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Kritická sekce
}
}
// Příklad použití Mutex
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Získat mutex
try
{
// Kritická sekce
}
finally
{
_mutex.ReleaseMutex(); // Uvolnit mutex
}
}
// Příklad použití Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Umožňuje 3 vlákna najednou
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Získat "přístup" k semaforu
try
{
// Kritická sekce, omezená na 3 vlákna
}
finally
{
_semaphore.Release(); // Uvolnit "přístup"
}
}