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(oderWaitAsyncfü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 ruftReleaseauf).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();
}
}