Heim Backend-Entwicklung Golang Wie verwende ich Sperren in Go?

Wie verwende ich Sperren in Go?

May 11, 2023 pm 03:33 PM
go语言 (go) 锁 (lock) 同步机制 (synchronization mechanism)

Bei der gleichzeitigen Programmierung ist Sperren ein Mechanismus zum Schutz gemeinsam genutzter Ressourcen. In der Go-Sprache sind Sperren eines der wichtigen Werkzeuge zum Erreichen von Parallelität. Es stellt sicher, dass beim gleichzeitigen Zugriff mehrerer Coroutinen auf gemeinsam genutzte Ressourcen nur eine Coroutine diese Ressourcen lesen oder ändern kann. In diesem Artikel wird die Verwendung von Sperren in der Go-Sprache vorgestellt, um den Lesern ein besseres Verständnis der gleichzeitigen Programmierung zu ermöglichen.

  1. Mutual Exclusion Lock

Mutual Exclusion Lock ist der am häufigsten verwendete Sperrmechanismus in der Go-Sprache. Dadurch wird sichergestellt, dass nur eine Coroutine gleichzeitig auf den kritischen Abschnitt zugreifen kann. Laienhaft ausgedrückt stellt eine Mutex-Sperre sicher, dass nur eine Coroutine gleichzeitig darauf zugreifen kann, indem gemeinsam genutzte Ressourcen in einen sperrenkritischen Abschnitt eingeschlossen werden.

Die Verwendung von Mutex-Sperren in der Go-Sprache ist sehr einfach. Wir können den Mutex-Typ im Synchronisierungspaket verwenden, um eine Mutex-Sperre zu erstellen:

import "sync"

var mutex = &sync.Mutex{}
Nach dem Login kopieren

Danach können wir an dem Ort, an dem gemeinsam genutzte Ressourcen geschützt werden müssen, den folgenden Code verwenden, um die Sperre zu erhalten:

mutex.Lock()
defer mutex.Unlock()
Nach dem Login kopieren
# 🎜🎜#Es ist erwähnenswert, dass Mutex-Sperren keinen Wiedereintritt unterstützen. Wenn eine Coroutine die Sperre bereits erworben hat, führt der Versuch, die Sperre erneut zu erlangen, zu einem Deadlock. Daher verwenden wir normalerweise die Defer-Anweisung, um die Sperre automatisch aufzuheben, wenn die Coroutine endet.

Das Folgende ist ein Beispiel für die Verwendung eines Mutex:

import (
    "fmt"
    "sync"
)

var count = 0
var mutex = &sync.Mutex{}

func increment(wg *sync.WaitGroup) {
    mutex.Lock()
    defer mutex.Unlock()
    count++
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Count:", count)
}
Nach dem Login kopieren

In diesem Beispiel verwenden wir einen Mutex, um einen Zähler zu schützen. 1000 Coroutinen führen die Inkrementierungsfunktion gleichzeitig aus und addieren jedes Mal 1 zum Zähler. Durch die Verwendung von Mutex-Sperren kann das Programm den endgültigen Zählerwert korrekt ausgeben.

    Lese-/Schreibsperre
In einer Umgebung mit mehreren Coroutinen ist die Lese-/Schreibsperre (Read-Write Lock) möglicherweise besser als Mutex sperren. Im Gegensatz dazu kann es effizient bleiben, wenn mehrere Coroutinen gleichzeitig von einer gemeinsam genutzten Ressource lesen, bei Schreibvorgängen ist jedoch immer noch ein sich gegenseitig ausschließender Zugriff erforderlich.

Lese-/Schreibsperren bestehen aus zwei Arten von Sperren: Lesesperren und Schreibsperren. Lesesperren ermöglichen mehreren Coroutinen den gleichzeitigen Zugriff auf gemeinsam genutzte Ressourcen, Schreibsperren stellen jedoch sicher, dass nur eine Coroutine gleichzeitig auf sie zugreifen kann.

In der Go-Sprache können Sie den RWMutex-Typ im Synchronisierungspaket verwenden, um eine Lese-/Schreibsperre zu erstellen.

import "sync"

var rwlock = &sync.RWMutex{}
Nach dem Login kopieren

Die Erfassungsmethoden der Lesesperre und der Schreibsperre sind unterschiedlich. Im Folgenden sind einige häufige Verwendungen aufgeführt:

    Lesesperre erwerben: rwlock.RLock()
  • Lesesperre freigeben: rwlock.RUnlock()
  • # 🎜🎜#Schreibsperre erwerben: rwlock.Lock()
  • Schreibsperre freigeben: rwlock.Unlock()
  • Das Folgende ist ein Beispiel für die Verwendung von Lese- Schreibsperre:
import (
    "fmt"
    "sync"
)

var count = 0
var rwlock = &sync.RWMutex{}

func increment(wg *sync.WaitGroup) {
    rwlock.Lock()
    defer rwlock.Unlock()
    count++
    wg.Done()
}

func read(wg *sync.WaitGroup) {
    rwlock.RLock()
    defer rwlock.RUnlock()
    fmt.Println("Count:", count)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()

    for i := 0; i < 5; i++ {
        wg.Add(1)
        go read(&wg)
    }
    wg.Wait()
}
Nach dem Login kopieren

In diesem Beispiel haben wir gleichzeitig 10 Coroutinen geöffnet, um Daten in den Zähler zu schreiben, und 5 Coroutinen, um die Zählerdaten zu lesen. Durch die Verwendung von Lese-/Schreibsperren können Programme gemeinsam genutzte Ressourcen auf effiziente Weise lesen und gleichzeitig die Atomizität von Schreibvorgängen sicherstellen.

Atomoperationen
  1. In der Go-Sprache können Sie auch atomare Operationen verwenden, um sicherzustellen, dass die Operation von Synchronisationsprimitiven atomar ist. Atomare Operationen erfordern keine Sperren und sind daher in manchen Situationen effizienter als Sperren.

Die Go-Sprache verfügt über mehrere integrierte atomare Operationsfunktionen. Sie können sich auf die offizielle Dokumentation beziehen. Hier sind zwei häufig verwendete atomare Operationsfunktionen: atomic.Add und atomic.Load.

atomic.Add: Führt eine atomare Additionsoperation für eine Ganzzahl durch.
  • atomic.Load: Den Wert einer Ganzzahl atomar lesen.
  • Das Folgende ist ein Beispiel:
import (
    "fmt"
    "sync/atomic"
    "time"
)

var count int32 = 0

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    atomic.AddInt32(&count, 1)
}

func printCount() {
    fmt.Println("Count: ", atomic.LoadInt32(&count))
}

func main() {
    var wg sync.WaitGroup

    for i := 0; i < 5; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    printCount()

    time.Sleep(time.Second)

    for i := 0; i < 3; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    printCount()
}
Nach dem Login kopieren

In diesem Beispiel verwenden wir die Funktion atomic.Add, um atomare Additionsoperationen am Zähler und am atomaren durchzuführen .Funktion atomar laden. Den Zählerwert manuell lesen. Durch die Verwendung atomarer Operationen können wir den Overhead von Sperren vermeiden und eine effizientere gleichzeitige Programmierung erreichen.

Zusammenfassung
  1. Die Go-Sprache bietet eine Vielzahl von Synchronisationsmechanismen, einschließlich Mutex-Sperren, Lese-/Schreibsperren und atomaren Operationen. Der Einsatz geeigneter Synchronisationsmechanismen bei der gleichzeitigen Programmierung ist der Schlüssel zur Gewährleistung einer korrekten und effizienten Ausführung von Programmen. Um Deadlocks zu vermeiden, müssen wir sorgfältig darüber nachdenken, welcher Sperrmechanismus für die aktuell gemeinsam genutzten Ressourcen am besten geeignet ist. In der Go-Sprache ist die Verwendung von Sperren sehr einfach. Es ist zu beachten, dass die Haltezeit der Sperre so weit wie möglich reduziert werden sollte, um die Leistung des Programms nicht zu beeinträchtigen.

Das obige ist der detaillierte Inhalt vonWie verwende ich Sperren in Go?. 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)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Chat -Befehle und wie man sie benutzt
4 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)

Wie verwende ich Konstanten in Go? Wie verwende ich Konstanten in Go? May 11, 2023 pm 04:52 PM

In Go sind Konstanten Bezeichner, die einen festen Wert behalten und sich während der Ausführung des Programms nicht ändern. Konstanten in Go werden mit dem Schlüsselwort const deklariert. In diesem Artikel erfahren Sie, wie Sie Konstanten in Go verwenden. So deklarieren Sie eine Konstante Das Deklarieren einer Konstante in Go ist sehr einfach. Verwenden Sie einfach das Schlüsselwort const. Das Format ist wie folgt: constidentifier[type]=value wobei Identifier der Konstantenname ist

So implementieren Sie die Routengruppierung in der Go-Sprache So implementieren Sie die Routengruppierung in der Go-Sprache Dec 17, 2023 pm 11:09 PM

Go-Sprache ist eine einfache und effiziente Programmiersprache, die auch im Bereich der Webentwicklung weit verbreitet ist. In der Webentwicklung ist Routing ein wesentlicher Bestandteil. Die Routing-Gruppierung ist eine erweiterte Routing-Funktion, die den Code klarer und prägnanter machen und die Lesbarkeit und Wartbarkeit des Codes verbessern kann. In diesem Artikel wird detailliert beschrieben, wie die Routing-Gruppierung in der Go-Sprache sowohl unter prinzipiellen als auch unter Code-Implementierungsaspekten implementiert wird. 1. Prinzip der Gruppierung Die Routing-Gruppierung entspricht der Gruppierung und Verwaltung einiger Routen mit ähnlichen Merkmalen. Beispielsweise können wir alle APIs konvertieren

Praxiserfahrung: Best Practices in Go-Sprachentwicklungsprojekten Praxiserfahrung: Best Practices in Go-Sprachentwicklungsprojekten Nov 02, 2023 pm 01:07 PM

Zusammenfassung: In diesem Artikel werden hauptsächlich die Best Practices in Go-Sprachentwicklungsprojekten vorgestellt. Durch die Erläuterung der Erfahrungen in den Bereichen Projektstrukturdesign, Fehlerbehandlung, Parallelitätsverarbeitung, Leistungsoptimierung und Tests können Entwickler die Herausforderungen in tatsächlichen Projekten besser bewältigen. 1. Gestaltung der Projektstruktur Vor dem Start eines Go-Sprachprojekts ist eine gute Gestaltung der Projektstruktur von entscheidender Bedeutung. Eine gute Projektstruktur kann die Effizienz der Teamzusammenarbeit verbessern und den Code und die Ressourcen des Projekts besser verwalten. Hier sind einige Best Practices für die Projektstruktur: Trennen Sie den Code so weit wie möglich

Was sind die Synchronisationsmechanismen in der Go-Sprache? Was sind die Synchronisationsmechanismen in der Go-Sprache? Jul 31, 2023 pm 05:35 PM

Zu den Synchronisierungsmechanismen der Go-Sprache gehören: 1. Mutex-Sperre, eine der grundlegendsten Synchronisierungsgrundelemente in Go; 2. Lese- und Schreib-Mutex-Sperre, die die Parallelitätsleistung verbessern kann; 3. Bedingungsvariablen, die zwischen mehreren Goroutinen verwendet werden Kommunikation; 4. Kanäle, der Hauptmechanismus für die Kommunikation zwischen Goroutinen; 5. Atomare Operationen, ein Mechanismus für einfache Operationen, die Parallelitätssicherheit erreichen; 6. Wird verwendet, um sicherzustellen, dass eine Operation nur einmal ausgeführt wird.

So verwenden Sie die Go-Sprache zum Üben der Code-Parallelisierung So verwenden Sie die Go-Sprache zum Üben der Code-Parallelisierung Aug 02, 2023 am 09:12 AM

Verwendung der Go-Sprache für die Praxis der Code-Parallelisierung In der modernen Softwareentwicklung ist die Leistung ein sehr wichtiger Gesichtspunkt. Um die Effizienz der Codeausführung zu verbessern, können wir parallele Programmiertechnologie verwenden. Als parallele Programmiersprache verfügt die Go-Sprache über eine Fülle von Parallelisierungstools und -funktionen, die uns dabei helfen können, eine gute Parallelisierung des Codes zu erreichen. In diesem Artikel wird die Verwendung der Go-Sprache für die Praxis der Code-Parallelisierung vorgestellt, angefangen bei der grundlegenden Parallelitätsverarbeitung bis hin zur Optimierung komplexer paralleler Algorithmen. Grundlegende Parallelitätsverarbeitung Unter Parallelitätsverarbeitung versteht man die gleichzeitige Ausführung mehrerer Aufgaben.

So implementieren Sie JAVA-Kern-Multithread-Programmierkenntnisse So implementieren Sie JAVA-Kern-Multithread-Programmierkenntnisse Nov 08, 2023 pm 01:30 PM

Als hervorragende Programmiersprache wird Java häufig in der Entwicklung auf Unternehmensebene eingesetzt. Unter diesen ist die Multithread-Programmierung einer der Kerninhalte von Java. In diesem Artikel stellen wir die Verwendung von Multithread-Programmiertechniken in Java sowie spezifische Codebeispiele vor. Möglichkeiten zum Erstellen von Threads Es gibt zwei Möglichkeiten, Threads in Java zu erstellen, nämlich die Thread-Klasse zu erben und die Runnable-Schnittstelle zu implementieren. Die Thread-Klasse kann wie folgt geerbt werden: publicclassExampleThreadext

So lösen Sie Java-Parallelitätsprobleme So lösen Sie Java-Parallelitätsprobleme Jun 30, 2023 am 08:24 AM

So lösen Sie in Java auftretende Code-Parallelitätsprobleme. Einführung: Bei der Java-Programmierung kommt es sehr häufig zu Parallelitätsproblemen. Parallelitätsprobleme treten auf, wenn mehrere Threads gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen und diese betreiben, was zu unvorhersehbaren Ergebnissen führen kann. Zu diesen Problemen können Datenrennen, Deadlocks, Livelocks usw. gehören. In diesem Artikel werden einige gängige und effektive Methoden zur Lösung von Parallelitätsproblemen in Java vorgestellt. 1. Synchronisationssteuerung: synchronisiertes Schlüsselwort: Das synchronisierte Schlüsselwort ist das grundlegendste Synchronisationsschlüsselwort in Java

So optimieren Sie die JSON-Serialisierung und -Deserialisierung in der Go-Sprachentwicklung So optimieren Sie die JSON-Serialisierung und -Deserialisierung in der Go-Sprachentwicklung Jul 01, 2023 pm 09:01 PM

So optimieren Sie die JSON-Serialisierung und -Deserialisierung bei der Go-Sprachentwicklung. Bei der Go-Sprachentwicklung ist JSON (JavaScriptObjectNotation) ein häufig verwendetes Serialisierungs- und Deserialisierungsformat. Es ist prägnant, lesbar und auf verschiedenen Plattformen einfach zu nutzen. Bei der Verarbeitung großer Datenmengen oder bei Szenarien mit hoher Parallelität kann die JSON-Serialisierungs- und Deserialisierungsleistung jedoch zu einem Leistungsengpass werden. In diesem Artikel werden einige Optimierungsmethoden für die JSON-Serialisierung und -Deserialisierung in der Go-Sprachentwicklung vorgestellt.

See all articles