Heim Backend-Entwicklung Golang So implementieren Sie eine Sperre mit Golang

So implementieren Sie eine Sperre mit Golang

Apr 25, 2023 pm 04:28 PM

Golang ist eine sehr beliebte Programmiersprache, die gleichzeitige Programmierung unterstützt. Um die Anforderungen der Parallelitätssicherheit zu erfüllen, bietet Golang einen Sperrmechanismus. Eine Sperre ist ein Synchronisierungsmechanismus, mit dem der Zugriff auf gemeinsam genutzte Ressourcen gesteuert werden kann. In diesem Artikel stellen wir vor, wie man Sperren mit Golang implementiert.

1. Arten von Sperren

In Golang gibt es drei Haupttypen von Sperren: Mutex-Sperren, Lese-/Schreibsperren und Bedingungsvariablen.

1. Mutex-Sperre (Mutex)

Mutex-Sperre ist die einfachste und am häufigsten verwendete Art von Sperre. Seine Funktion besteht darin, nur einem Thread gleichzeitig den Zugriff auf gemeinsam genutzte Ressourcen zu ermöglichen. Wenn andere Threads versuchen, auf die Ressource zuzugreifen, werden sie blockiert, bis die Sperre aufgehoben wird.

2. Lese-Schreib-Sperre (RWMutex)

Lese-Schreib-Sperre ist eine andere Art von Sperre, die es mehreren Threads ermöglicht, gemeinsam genutzte Ressourcen gleichzeitig zu lesen, jedoch nur einen Thread darf diese Ressource schreiben. Diese Sperre ist effizienter als ein Mutex, da sie gleichzeitige Lesevorgänge ermöglicht, Schreibvorgänge jedoch ausschließlich die Ressource belegen müssen.

3. Bedingungsvariable (Cond)

Bedingungsvariable ist ein erweiterter Synchronisationsmechanismus, der einen Mechanismus zum Warten und zur Kommunikation zwischen mehreren Threads bereitstellt. Bedingungsvariablen verfügen über zwei Hauptmethoden: Wait und Signal. Die Wait-Methode kann den Thread in den Ruhezustand versetzen, um auf bestimmte Bedingungen zu warten, während die Signal-Methode den wartenden Thread darüber benachrichtigt, dass die Bedingung erfüllt ist.

2. Implementierung von Mutex-Sperren

Die Standardbibliothek von Golang bietet die Implementierung von Mutex-Sperren. Sie können den Mutex-Typ im Synchronisierungspaket verwenden, um Mutex-Sperren zu implementieren. Das Folgende ist ein Beispielprogramm:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    lock  sync.Mutex
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            lock.Lock()
            count++
            lock.Unlock()
            wg.Done()
        }()
    }
    wg.Wait()
    fmt.Println(count)
}
Nach dem Login kopieren

Im obigen Code definieren wir einen Zählerzähler und erstellen eine Mutex-Sperre. Dann werden 100 Goroutinen gestartet und der Zähler wird in jeder Goroutine um 1 erhöht. Da der Zugriff auf count gleichzeitig erfolgt, müssen wir eine Mutex-Sperre verwenden, um das Auftreten von Race Conditions zu verhindern.

Es ist zu beachten, dass bei Vorgängen mit gemeinsam genutzten Ressourcen der Vorgang nach dem Erwerb der Sperre ausgeführt werden muss und die Sperre nach Abschluss des Vorgangs aufgehoben werden muss, um sicherzustellen, dass alle Vorgänge atomar sind.

3. Implementierung von Lese-/Schreibsperren

Ähnlich wie Mutex-Sperren bietet die Standardbibliothek von Golang auch die Implementierung von Lese-/Schreibsperren. Sie können RWMutex im Synchronisierungspaket verwenden um eine Lese-/Schreibsperre zu implementieren. Das Folgende ist ein Beispielprogramm:

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    rw    sync.RWMutex
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            rw.Lock()
            count++
            rw.Unlock()
            wg.Done()
        }()
    }
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            rw.RLock()
            fmt.Println(count)
            rw.RUnlock()
            wg.Done()
        }()
    }
    wg.Wait()
}
Nach dem Login kopieren

Im obigen Code verwenden wir den Typ RWMutex, um Lese-/Schreibsperren zu implementieren. Starten Sie zunächst 100 Goroutinen, um 1 zum Zähler hinzuzufügen. Während dieser Zeit kann der Zähler nur von einem Thread belegt werden. Starten Sie dann 100 Goroutinen, um den Zählerwert zu lesen. Diese Goroutinen können den Zählerwert gleichzeitig lesen.

Im Vergleich zu Mutex-Sperren weisen Lese-/Schreibsperren eine höhere Parallelität und weniger Sperrkonflikte auf. Wenn es sich bei den meisten Vorgängen um Lesevorgänge handelt, kann die Verwendung von Lese-/Schreibsperren anstelle von Mutex-Sperren die Leistung verbessern.

4. Implementierung von Bedingungsvariablen

Bedingungsvariablen sind ein erweiterter Synchronisierungsmechanismus, der Threads in den Ruhezustand versetzen und auf die Erfüllung bestimmter Bedingungen warten kann. Bedingungsvariablen werden ebenfalls im Sync-Paket bereitgestellt und können mithilfe des Cond-Typs implementiert werden. Das Folgende ist ein Beispielprogramm:

package main

import (
    "fmt"
    "sync"
)

var (
    count   int
    waiters int
    lock    sync.Mutex
    cond    *sync.Cond = sync.NewCond(&lock)
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            lock.Lock()
            for count < 5 {
                waiters++
                cond.Wait()
                waiters--
            }
            fmt.Println("Count:", count)
            lock.Unlock()
            wg.Done()
        }()
    }
    for i := 0; i < 5; i++ {
        wg.Add(1)
        go func() {
            lock.Lock()
            count++
            if waiters > 0 {
                cond.Signal()
            }
            lock.Unlock()
            wg.Done()
        }()
    }
    wg.Wait()
}
Nach dem Login kopieren

Im obigen Code definieren wir einen Zählerzähler und einen Count Waiter für wartende Threads. Starten Sie dann 10 Goroutinen, um darauf zu warten, dass der Zähler 5 erreicht, und geben Sie den Wert des Zählers aus, wenn der Zähler 5 erreicht. Starten Sie 5 weitere Goroutinen, um 1 zum Zähler hinzuzufügen. Wenn der Zähler 5 erreicht, rufen Sie cond.Signal() auf, um die wartende Goroutine aufzuwecken.

Es ist zu beachten, dass vor Verwendung der Bedingungsvariablen die Mutex-Sperre erhalten werden muss, da sonst ein Deadlock auftritt.

5. Zusammenfassung

In diesem Artikel werden drei gängige Sperrtypen in Golang vorgestellt: Mutex-Sperren, Lese-/Schreibsperren und Bedingungsvariablen. Mutex-Sperren sind die am häufigsten verwendeten Sperren, um zu verhindern, dass mehrere Threads gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen. Lese-Schreibsperren erlauben mehrere Lesevorgänge, aber nur exklusive Schreibvorgänge. Bedingungsvariablen sind ein erweiterter Synchronisierungsmechanismus, der es Threads ermöglicht, auf die Erfüllung bestimmter Bedingungen zu warten.

Beim Schreiben von Golang-Programmen ist die Wahl des geeigneten Sperrtyps entscheidend, um die Sicherheit der Parallelität zu erreichen. Um die Parallelitätsleistung zu verbessern, muss der entsprechende Sperrtyp entsprechend dem Anwendungsszenario und den spezifischen Anforderungen ausgewählt werden.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie eine Sperre mit Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was sind die Schwachstellen von Debian Openensl Was sind die Schwachstellen von Debian Openensl Apr 02, 2025 am 07:30 AM

OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Wie verwenden Sie das PPROF -Tool, um die Go -Leistung zu analysieren? Mar 21, 2025 pm 06:37 PM

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

Wie schreibt man Unit -Tests in Go? Wie schreibt man Unit -Tests in Go? Mar 21, 2025 pm 06:34 PM

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Welche Bibliotheken werden für die Operationen der schwimmenden Punktzahl in Go verwendet? Apr 02, 2025 pm 02:06 PM

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Was ist das Problem mit Warteschlangen -Thread in Go's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

Wie verwenden Sie tabelgesteuerte Tests in Go? Wie verwenden Sie tabelgesteuerte Tests in Go? Mar 21, 2025 pm 06:35 PM

In dem Artikel werden mit Tabellensteuerungstests in GO eine Methode mit einer Tabelle mit Testfällen getestet, um Funktionen mit mehreren Eingaben und Ergebnissen zu testen. Es zeigt Vorteile wie eine verbesserte Lesbarkeit, verringerte Vervielfältigung, Skalierbarkeit, Konsistenz und a

Wie geben Sie Abhängigkeiten in Ihrer Go.Mod -Datei an? Wie geben Sie Abhängigkeiten in Ihrer Go.Mod -Datei an? Mar 27, 2025 pm 07:14 PM

In dem Artikel werden die Verwaltungs -Go -Modulabhängigkeiten über Go.mod erörtert, die Spezifikationen, Aktualisierungen und Konfliktlösung abdecken. Es betont Best Practices wie semantische Versioning und reguläre Updates.

Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Erläutern Sie den Zweck von Go's Reflect Package. Wann würden Sie Reflexion verwenden? Was sind die Leistungsauswirkungen? Mar 25, 2025 am 11:17 AM

In dem Artikel wird das Reflect -Paket von Go, das zur Laufzeitmanipulation von Code verwendet wird, von Vorteil für die Serialisierung, generische Programmierung und vieles mehr. Es warnt vor Leistungskosten wie langsamere Ausführung und höherer Speichergebrauch, beraten die vernünftige Verwendung und am besten am besten

See all articles