Mutex жана semaphore менен lock кандай айырмаланат?
sobes.tech AI
AIден жооп
lock C# — бул синтаксикалык шекер Monitor.Enter жана Monitor.Exit колдонуу үчүн, аларды try-finally блокунда капталган, блокировканы кепилдүү бошотуу үчүн. Ал бир агымга ресурска эксклюзивдүү кирүүгө мүмкүндүк берет. Негизинен, бул объект деңгээлиндеги эң жөнөкөй синхрондоштуруу primitive.
Mutex (мутикс) — бул синхрондоштуруу primitive, ал бир агымга ресурска эксклюзивдүү кирүүнү камсыз кылуу үчүн колдонулушу мүмкүн бир нече процесстеги агымдар арасында. Ал агымдын ээлик кылуу түшүнүгүн камтыйт: мютекс ал алган агым гана аны бошотушу мүмкүн.
Semaphore (семафор) — бул синхрондоштуруу primitive, ал бир убакта ресурска кире алчу агымдардын санын чектейт. Семафор эсептегичке ээ, ал кирүү учурунда азаяды жана бошотуу учурунда көбөйөт.
Негизги айырмачылыктар таблицада көрсөтүлгөн:
| Өзгөчөлүк | lock (Monitor) |
Mutex |
Semaphore |
|---|---|---|---|
| Көрүнүү чөйрөсү | Бир процесстин ичинде | Процесстер ортосунда | Процесстер ортосунда |
| Агымдардын саны | Бир гана | Бир гана ( ээ) | Чектелген сан |
| Ээлөө | Агымга байланыштуу | Агымга байланыштуу | Агымга байланыштуу эмес |
| Колдонуу | Жөнөкөй синхрондоштуруу | Процесстер ортосунда, аталыштуу мютекстер | Бир убакта ресурска кирүүнү чектөө |
| Исключения | Ачык иштетүүнү талап кылбайт AbandonedMutexException | AbandonedMutexException иштетүүнү талап кылат | AbandonedSemaphoreException жок |
// Lock колдонуу мисалы
private readonly object _lockObject = new object();
public void DoSomethingWithLock()
{
lock (_lockObject)
{
// Критикалык бөлүм
}
}
// Mutex колдонуу мисалы
using System.Threading;
private Mutex _mutex = new Mutex();
public void DoSomethingWithMutex()
{
_mutex.WaitOne(); // Мютекс алуу
try
{
// Критикалык бөлүм
}
finally
{
_mutex.ReleaseMutex(); // Мютекс бошотуу
}
}
// Semaphore колдонуу мисалы
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // 3 агымга уруксат берилет
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // "Доступ" алуу семафорго
try
{
// Критикалык бөлүм, 3 агымга чектелген
}
finally
{
_semaphore.Release(); // "Доступ" бошотуу
}
}