Мутекс ва семафор бо lock чӣ фарқ доранд?
sobes.tech AI
Ҷавоб аз AI
lock дар C# — ин шакли синтаксисӣ барои истифодаи Monitor.Enter ва Monitor.Exit, ки дар блоки try-finally пӯшида шудаанд, барои таъмини озод кардани банд. Он дастрасии истисноиро ба манбаъ барои як ҷараён медиҳад. Дар асл, ин соддатарин примитиви ҳамоҳангсозӣ дар сатҳи объект мебошад.
Mutex (муҳит) — ин примитиви ҳамоҳангсозӣ аст, ки метавонад барои таъмин кардани дастрасии истисноӣ ба манбаъ барои як ҷараён ҷараёнҳо дар чанд раванд истифода шавад. Он мафҳуми соҳибӣ ба ҷараёнро дорад: танҳо ҷараён, ки mutex-ро гирифтааст, метавонад онро озод кунад.
Semaphore (семафор) — ин примитиви ҳамоҳангсозӣ аст, ки шумораи ҷараёнҳоро маҳдуд мекунад, ки метавонанд ҳамзамон ба манбаъ дастрасӣ пайдо кунанд. Семафор ҳисобиро дорад, ки ҳангоми гирифтани дастрасӣ кам мешавад ва ҳангоми озод кардан зиёд мешавад.
Тавсифи асосӣ дар ҷадвал оварда шудааст:
| Хусусият | 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(); // Гирифтани mutex
try
{
// Қисми критикӣ
}
finally
{
_mutex.ReleaseMutex(); // Озод кардани mutex
}
}
// Намунаи истифодаи Semaphore
using System.Threading;
private Semaphore _semaphore = new Semaphore(3, 3); // Меъёри 3 ҷараён дар як вақт
public void DoSomethingWithSemaphore()
{
_semaphore.WaitOne(); // Гирифтани "дастрасӣ" ба семафор
try
{
// Қисми критикӣ, ки маҳдуд ба 3 ҷараён
}
finally
{
_semaphore.Release(); // Озод кардани "дастрасӣ"
}
}