Como usar mutexes e semáforos em C#



Como usar mutexes e semáforos em C#

Um semáforo é usado para limitar o número de threads que têm acesso a um recurso compartilhado ao mesmo tempo. Em outras palavras, um semáforo permite que você implemente o bloqueio não exclusivo e, portanto, limite a simultaneidade. Você pode pensar em um semáforo como uma forma não exclusiva de um mutex. No .NET, usamos a classe System.Threading.Semaphore para trabalhar com semáforos.

Crie um mutex em C#

Vamos criar um objeto mutex no .web. Observe que usamos o método wagone em uma instância da classe Mutex para bloquear um recurso e o método RELEASEMUTEX para desbloqueá -lo.


Mutex mutexObject = new Mutex(false, "Demo");

attempt
{
    if (!mutexObject.WaitOne(TimeSpan.FromSeconds(10), false))
    {
        Console.WriteLine("Quitting for now as one other occasion is in execution...");
        return;
    }
}
lastly
{
    mutexObject.ReleaseMutex();
}

Vamos agora implementar um exemplo de código da vida actual que usa um mutex para sincronizar o acesso a um recurso compartilhado. A lista de código a seguir demonstra como você pode usar um objeto Mutex em C# para sincronizar o acesso a uma seção crítica que grava dados em um arquivo de texto.


public static class FileLogger
{
    personal const string fileName = @"D:ProjectsMyLog.txt";
    public static void WriteLog(string textual content)
    {
        utilizing var mutex = new Mutex(initiallyOwned: false, "Worldlog");

        attempt
        {
            mutex.WaitOne(1000);
            File.AppendAllText(fileName, textual content);
        }
        catch (AbandonedMutexException)
        {
            mutex.ReleaseMutex();
            mutex.WaitOne(1000);
            File.AppendAllText(fileName, textual content);
        }
        lastly
        {
            mutex.ReleaseMutex();
        }
    }
}

Na classe FileLogger mostrada acima, é feita uma tentativa de adquirir um mutex bloqueando o thread atual por 1000 milissegundos. Se o mutex for adquirido, o texto passado para o método ApndendAltText como parâmetro será gravado em um arquivo de texto. O bloco finalmente libera o mutex fazendo uma chamada para o método RELEASEMUTEX.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *