Sobes.tech
Middle

Мутекс ва семафор бо 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(); // Озод кардани "дастрасӣ"
    }
}