Detaillierte Erläuterung der im Synchronisierungspaket bereitgestellten Sperren und ihrer Implementierungsmethoden

PHPz
Freigeben: 2023-04-05 09:44:49
Original
702 Leute haben es durchsucht

Bei der gleichzeitigen Programmierung sind Sperren ein wichtiges Werkzeug zur Lösung von Zugriffskonflikten auf gemeinsam genutzte Ressourcen. Die Sperrimplementierung im in der Go-Sprache bereitgestellten Synchronisierungspaket ist ein wichtiger Teil der gleichzeitigen Programmierung. In diesem Artikel werden die im Synchronisierungspaket bereitgestellten Sperren und ihre Implementierungsmethoden vorgestellt, um den Lesern ein besseres Verständnis des Sperrmechanismus bei der gleichzeitigen Programmierung zu ermöglichen.

1. Sperrenimplementierung im Sync-Paket

Das Sync-Paket bietet drei Arten von Sperren: Mutex (Mutex), Lese-/Schreibsperre (RWMutex) und Wartegruppe (WaitGroup). Ihre Implementierungsmethoden werden im Folgenden separat vorgestellt.

1. Mutex (Mutex)

Mutex ist die einfachste Form der Sperre, die zum Schutz des gleichzeitigen Zugriffs auf gemeinsam genutzte Ressourcen verwendet wird. Die Verwendung einer Mutex-Sperre ermöglicht nur einer Goroutine den Zugriff auf eine gemeinsam genutzte Ressource und gewährleistet so einen sicheren Zugriff auf die Ressource. Die Implementierungsmethode der Mutex-Sperre kann sich auf den folgenden Code beziehen:

var mu sync.Mutex
var count int

func main() {
    for i := 0; i<10; i++ {
        go func(){
            mu.Lock()
            defer mu.Unlock()

            count++
            fmt.Println(count)
        }()
    }

    time.Sleep(time.Second)
}
Nach dem Login kopieren

Im obigen Code verwenden wir die Lock- und Unlock-Methoden im Typ sync.Mutex, um den gleichzeitigen Zugriff auf die Zählvariable zu schützen. Durch Aufrufen der Lock-Methode können Sie eine Mutex-Sperre erhalten, um die Anzahl gleichzeitiger Zugriffe auf die Ressource zu steuern. Nachdem Sie die entsprechende Logik ausgeführt haben, müssen Sie die Unlock-Methode aufrufen, um die Mutex-Sperre aufzuheben.

2. Lese-/Schreibsperre (RWMutex)

Die Lese-/Schreibsperre ist eine Sperre, die das Problem von mehr Lesen und weniger Schreiben lösen soll. In Szenarien mit vielen Lesevorgängen und wenigen Schreibvorgängen sind die Kosten für die Verwendung eines Mutex relativ hoch, da beim Lesen gemeinsam genutzter Ressourcen keine Sperre erforderlich ist. Wenn der schreibende Thread die Ressourcen direkt ändert, ist eine Sperre erforderlich.

Daher kann die Verwendung von Lese-/Schreibsperren die Parallelität des Programms verbessern. Das Folgende ist ein Beispiel für die Verwendung einer Lese-/Schreibsperre:

var rw sync.RWMutex
var count int

func main() {
    for i := 0; i<10; i++ {
        go func(){
            rw.RLock()
            defer rw.RUnlock()

            fmt.Println(count)
        }()
    }

    time.Sleep(time.Second)
}
Nach dem Login kopieren

Im obigen Code verwenden wir die Methoden RLock und RUnlock im Typ sync.RWMutex, um Lesevorgänge auf gemeinsam genutzte Ressourcen zu schreiben, während die Schreibvorgänge den Typ Mutex verwenden Methode zum Sperren und Entsperren.

Es ist zu beachten, dass, wenn die Lesesperre bereits belegt ist, die Schreibsperre warten muss, bis alle Lesesperren freigegeben werden, bevor sie erworben werden kann, und dass sie auch warten muss, bis die aktuelle Schreibsperre freigegeben wird es kann die Lesesperre erwerben. Daher müssen Sie bei der Verwendung von Lese-/Schreibsperren überlegen, wie Sie diese je nach Situation verwenden.

3. Wait Group (WaitGroup)

Wait Group ist ein praktisches Tool, mit dem mehrere Goroutinen gemeinsam auf den Abschluss warten können.

Die Wartegruppe wird mit dem Wert Null initialisiert, Goroutinen können hinzugefügt und entfernt werden, und wenn ihr interner Zähler Null erreicht, werden alle blockierenden und wartenden Goroutinen geweckt. Im folgenden Code verwenden wir die Add- und Done-Methoden der Wartegruppe, um die Anzahl der Goroutinen zu steuern:

var wg sync.WaitGroup

func main() {
    for i := 0; i<10; i++ {
        wg.Add(1)
        go func(){
            defer wg.Done()

            fmt.Println("goroutine")
        }()
    }

    wg.Wait()
    fmt.Println("finished")
}
Nach dem Login kopieren

Im obigen Code verwenden wir zuerst die Add-Methode, um 10 Goroutinen zur Wartegruppe hinzuzufügen, und führen sie dann aus relevante Logik, nachdem sie fertig sind. Verwenden Sie abschließend die Done-Methode, um den Wartegruppenzähler zu reduzieren. Verwenden Sie am Ende die Methode wg.Wait(), um darauf zu warten, dass alle Zähler in der Wartegruppe gelöscht werden.

2. Zusammenfassung

In diesem Artikel werden die im Synchronisierungspaket in der Sprache Go bereitgestellten Methoden zur Sperrenimplementierung vorgestellt, einschließlich Mutex-Sperren, Lese-/Schreibsperren und Wartegruppen. Diese Sperren sind grundlegende Werkzeuge bei der gleichzeitigen Programmierung in der Go-Sprache und spielen eine wichtige Rolle bei der Kontrolle des Ressourcenzugriffs und der Erhöhung der Programm-Parallelität. Indem wir lernen, sie zu verwenden, können wir den Sperrmechanismus bei der gleichzeitigen Programmierung besser verstehen und effizientere und sicherere gleichzeitige Programme schreiben.

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der im Synchronisierungspaket bereitgestellten Sperren und ihrer Implementierungsmethoden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!