Sobes.tech
Middle+

Was ist ein Semaphore-Synchronisationsprimitive?

sobes.tech KI

Antwort von AI

Semaphore — ist ein Synchronisationsprimitive, das den Zugriff auf einen begrenzten Ressourcenpool steuert. Es führt einen Zähler, der bestimmt, wie viele Threads gleichzeitig auf die Ressource zugreifen können.

Hauptoperationen:

  • WaitOne (oder WaitAsync für asynchronen Code): Verringert den Zähler, wenn er größer als null ist. Wenn der Zähler null ist, wird der Thread blockiert, bis der Zähler positiv wird (ein anderer Thread ruft Release auf).
  • Release: Erhöht den Zähler und kann den wartenden Thread freigeben.

Typen von Semaphore:

  • Semaphore: Systemweit (mit oder ohne Namen), kann zwischen Prozessen verwendet werden.
  • SemaphoreSlim: Leichtgewichtige Implementierung, die für die Verwendung innerhalb eines Prozesses vorgesehen ist. Bevorzugt für die intra-prozessuale Synchronisation.

Beispiel für die Verwendung von SemaphoreSlim:

// semaphoreSlim kann verwendet werden, um den gleichzeitigen Zugriff auf eine Ressource zu beschränken
// In diesem Fall sind 2 Threads gleichzeitig erlaubt
private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2);

public async Task AccessResourceAsync()
{
    // Wartet auf die Freigabe des Semaphors
    await semaphoreSlim.WaitAsync();
    try
    {
        // Zugriff auf die begrenzte Ressource
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} greift auf die Ressource zu");
        await Task.Delay(1000); // Simulation der Arbeit mit der Ressource
    }
    finally
    {
        // Gibt das Semaphor frei
        Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId} gibt die Ressource frei");
        semaphoreSlim.Release();
    }
}