Technologieaustausch

Detaillierte Erklärung und Anwendung von Semaphor (Semaphor) in C#

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Fügen Sie hier eine Bildbeschreibung ein


Bei der gleichzeitigen Programmierung ist Synchronisation eine Grundvoraussetzung. Semaphore ist ein allgemeiner Synchronisationsmechanismus, der zur Steuerung des Zugriffs auf gemeinsam genutzte Ressourcen verwendet wird. In C# werden Semaphore über die Semaphore-Klasse im System.Threading-Namespace implementiert. In diesem Artikel werden Semaphore und seine Anwendungen in C# ausführlich vorgestellt.

1. Was ist ein Semaphor?

Ein Semaphor ist ein ganzzahliger Wert, der zur Steuerung des Zugriffs auf eine gemeinsam genutzte Ressource verwendet werden kann. Semaphore werden hauptsächlich für zwei Zwecke verwendet:

Gegenseitig ausschließend: Stellen Sie sicher, dass nur ein Thread gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen kann.
zählen: Ermöglichen Sie einer bestimmten Anzahl von Threads den gleichzeitigen Zugriff auf gemeinsam genutzte Ressourcen.
Semaphore werden normalerweise in den folgenden Szenarien verwendet:

  • Beschränken Sie den gleichzeitigen Zugriff auf Ressourcen, indem Sie beispielsweise die Anzahl der Datenbankverbindungen begrenzen.
  • Synchronisieren des Lesens und Schreibens von Daten in einem Producer-Consumer-Problem.
  • Synchronisieren Sie den Zugriff auf gemeinsam genutzte Ressourcen zwischen mehreren Prozessen.

2. Semaphore-Klasse in C#

In C# stellt die Semaphore-Klasse grundlegende Operationen für Semaphoren bereit. Um ein Semaphor zu erstellen, verwenden Sie die folgende Syntax:

Semaphore semaphore = new Semaphore(initialCount, maximumCount);
  • 1

initialCount: Der anfängliche Zählwert des Semaphors, der den Wert des Semaphors zum Zeitpunkt seiner Erstellung angibt.
MaximumCount: Der maximale Zählwert des Semaphors, der den maximalen Wert angibt, den das Semaphor erreichen kann.

3. Beispiele für die Verwendung von Semaphoren

3.1 Erstellen Sie ein Semaphor

Erstellen Sie in C# ein Semaphor mit der SemaphoreSlim-Klasse. Diese Klasse ist eine Synchronisationskontextimplementierung von Semaphore und bietet flexiblere asynchrone Vorgänge.

mit System.Threading;

öffentliche Klasse SemaphoreExample
{
private SemaphoreSlim semaphore = new SemaphoreSlim(3); // Erstelle ein Zählsemaphor, um 3 Threads den gleichzeitigen Zugriff zu ermöglichen

public void DoWork()
{
    semaphore.Wait(); // 获取信号量,如果信号量小于0,线程将被阻塞

    try
    {
        // 执行共享资源的操作
    }
    finally
    {
        semaphore.Release(); // 释放信号量
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

}

3.2 Verwenden Sie Semaphoren, um Threads zu synchronisieren

Das Folgende ist ein einfaches Beispiel, das zeigt, wie Semaphor-Ressourcen erstellt, abgerufen und freigegeben werden.

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建信号量,允许3个线程同时访问共享资源
        Semaphore semaphore = new Semaphore(3, 3);

        // 创建和启动线程
        for (int i = 0; i < 10; i++)
        {
            new Thread(() => Work(semaphore)).Start();
        }
    }

    static void Work(Semaphore semaphore)
    {
        try
        {
            // 获取信号量
            semaphore.WaitOne();

            // 执行共享资源的操作
            Console.WriteLine($"线程 {Thread.CurrentThread.ManagedThreadId} 正在执行。");
            Thread.Sleep(1000);
        }
        finally
        {
            // 释放信号量
            semaphore.Release();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

In diesem Beispiel erstellen wir ein Semaphor, das es bis zu drei Threads ermöglicht, die Work-Methode gleichzeitig auszuführen. Jeder Thread versucht, das Semaphor abzurufen, wenn er semaphore.WaitOne() aufruft. Wenn der Wert des Semaphors größer als 0 ist, wird der Thread weiter ausgeführt. Andernfalls wird der Thread blockiert, bis ein anderer Thread das Semaphor freigibt.

Asynchrone Operationen
Die SemaphoreSlim-Klasse bietet auch asynchrone Warte- und Freigabemethoden:

  1. wait semaphore.WaitAsync(): Asynchrones Warten auf das Semaphor
  2. wait semaphore.ReleaseAsync(): Geben Sie das Semaphor asynchron frei

Dies macht den Einsatz von Semaphoren flexibler und lässt sich besser in asynchrone Programmiermodelle integrieren.

4. Zusammenfassung

Semaphor (Semaphor) in C# ist ein leistungsstarker Synchronisierungsmechanismus, der Entwicklern dabei helfen kann, den Zugriff auf gemeinsam genutzte Ressourcen zu steuern. Durch die Verwendung von Semaphoren können wir den Zugriff mehrerer Threads auf gemeinsam genutzte Ressourcen effektiv verwalten und so sicherstellen, dass die Ressourcennutzung nicht zu Datenwettläufen oder anderen Synchronisierungsproblemen führt.

Die Bedeutung von Semaphore in der C#-Programmierung spiegelt sich in seiner Fähigkeit wider, Entwickler bei der Implementierung komplexer Parallelitätskontrolllogik zu unterstützen und gleichzeitig die Lesbarkeit und Wartbarkeit des Codes aufrechtzuerhalten. Seine Benutzerfreundlichkeit spiegelt sich in seinem einfachen API-Design und der umfangreichen Unterstützung für Synchronisierungskontexte wider.

In praktischen Anwendungen können Semaphoren verwendet werden, um die Größe des Datenbankverbindungspools zu begrenzen, den Zugriff auf Netzwerkressourcen zu steuern und eine Synchronisierung des Producer-Consumer-Modells usw. zu erreichen. Wir hoffen, dass die Leser durch die Einleitung dieses Artikels die Prinzipien und die Verwendung von Semaphore besser verstehen und in tatsächlichen Projekten nutzen können.