Maison développement back-end Golang Une analyse approfondie du fonctionnement des verrous à Golang

Une analyse approfondie du fonctionnement des verrous à Golang

Dec 28, 2023 pm 01:50 PM
锁 (lock) 工作原理 (working principle) golang (golang)

Une analyse approfondie du fonctionnement des verrous à Golang

Analyse approfondie du fonctionnement des verrous dans Golang

Introduction :
En programmation concurrente, il est crucial d'éviter les conditions de concurrence. Afin d'assurer la sécurité des threads, Golang fournit un riche mécanisme de verrouillage. Cet article fournira une analyse approfondie du fonctionnement des verrous dans Golang et fournira des exemples de code spécifiques.

1. Verrouillage Mutex (Mutex)

Le verrouillage Mutex est le mécanisme de verrouillage le plus couramment utilisé. Golang fournit le type Mutex dans le package de synchronisation pour l'implémenter. Mutex propose deux méthodes : Lock() et Unlock(), qui sont utilisées respectivement pour le verrouillage et le déverrouillage.

Les verrous Mutex fonctionnent en essayant de verrouiller avant d'accéder aux ressources partagées. Si le verrou est déjà détenu par un autre thread, le thread actuel sera bloqué en attente. Une fois le verrou libéré, le thread en attente sera réveillé et poursuivra son exécution.

Ce qui suit est un exemple de code utilisant un verrou mutex :

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mutex sync.Mutex
)

func increment() {
    mutex.Lock()
    defer mutex.Unlock()
    count++
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            increment()
        }()
    }
    wg.Wait()
    fmt.Println("Count:", count)
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons un nombre de variables entières comme ressource partagée. La fonction incrément() est utilisée pour augmenter la valeur de count. En utilisant un mutex pour protéger l'accès au compte, cela garantit qu'il n'y aura pas de concurrence entre les données lorsque plusieurs goroutines y accéderont en même temps.

2. Verrouillage en lecture-écriture (RWMutex)

Il y a un problème lorsque les verrous mutex protègent les ressources partagées : même s'il n'y a que des opérations de lecture, elles ne peuvent pas être exécutées en parallèle. Pour résoudre ce problème, Golang fournit un verrouillage en lecture-écriture (RWMutex).

Le verrouillage en lecture-écriture est un mécanisme de verrouillage spécial qui permet à plusieurs goroutines de lire des ressources partagées en même temps, mais ne permet qu'à une seule goroutine d'effectuer des opérations d'écriture.

RWMutex fournit trois méthodes : RLock(), RUnlock() et Lock(), qui sont utilisées respectivement pour ajouter des verrous de lecture, des verrous d'interprétation et des verrous d'écriture.

Ce qui suit est un exemple de code utilisant un verrou en lecture-écriture :

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    count int
    rwLock sync.RWMutex
)

func read() {
    rwLock.RLock()
    defer rwLock.RUnlock()
    fmt.Println("Read:", count)
}

func write() {
    rwLock.Lock()
    defer rwLock.Unlock()
    count++
    fmt.Println("Write:", count)
}

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

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

    wg.Wait()
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons un nombre de variables entières pour simuler des ressources partagées. La fonction read() est utilisée pour lire la valeur de count et la fonction write() est utilisée pour augmenter la valeur de count. En utilisant des verrous en lecture-écriture pour protéger l'accès au décompte, les opérations de lecture peuvent être exécutées en parallèle, tandis que les opérations d'écriture s'excluent mutuellement.

3. Variable de condition (Cond)

La variable de condition est un mécanisme de verrouillage spécial, utilisé pour réaliser la synchronisation entre les threads. Les variables de condition peuvent contrôler avec précision l'ordre d'exécution des threads et éviter l'attente de boucle non valide.

Golang fournit le type Cond dans le package de synchronisation pour implémenter les variables de condition. Cond propose trois méthodes : Wait(), Signal() et Broadcast(). La méthode

  • Wait() est utilisée pour attendre que la variable de condition soit satisfaite, tout en libérant le verrou et en suspendant le thread en cours.
  • La méthode Signal() est utilisée pour réveiller un thread en attente. La méthode
  • Broadcast() est utilisée pour réveiller tous les threads en attente.

Ce qui suit est un exemple de code utilisant des variables de condition :

package main

import (
    "fmt"
    "sync"
    "time"
)

var (
    count int
    cond *sync.Cond
)

func producer() {
    for {
        cond.L.Lock()
        count++
        fmt.Println("Produce:", count)
        cond.Signal()
        cond.L.Unlock()
        time.Sleep(time.Second)
    }
}

func consumer() {
    for {
        cond.L.Lock()
        for count == 0 {
            cond.Wait()
        }
        fmt.Println("Consume:", count)
        count--
        cond.L.Unlock()
    }
}

func main() {
    var wg sync.WaitGroup
    cond = sync.NewCond(&sync.Mutex{})
    wg.Add(2)
    go func() {
        defer wg.Done()
        producer()
    }()

    go func() {
        defer wg.Done()
        consumer()
    }()

    wg.Wait()
}
Copier après la connexion

Dans le code ci-dessus, nous utilisons un nombre de variables entières pour simuler des ressources partagées. La fonction producteur() est utilisée pour augmenter la valeur de count et réveiller le thread en attente, et la fonction consumer() est utilisée pour décrémenter la valeur de count et attendre que la condition soit remplie. La synchronisation entre producteur et consommateur est assurée grâce à l'utilisation de variables de condition.

Conclusion :
Cet article fournit une analyse approfondie du fonctionnement des verrous dans Golang et fournit des exemples de code spécifiques pour chaque mécanisme de verrouillage. Les verrous mutex, les verrous en lecture-écriture et les variables de condition sont les mécanismes de verrouillage les plus couramment utilisés dans Golang. Les développeurs peuvent choisir les verrous appropriés en fonction des besoins réels pour protéger l'accès aux ressources partagées et garantir la sécurité des threads du programme. Dans le même temps, les développeurs doivent prêter attention aux scénarios d'utilisation et à l'impact des verrous sur les performances afin d'éviter une concurrence inutile entre les verrous et des problèmes de blocage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment fonctionne le middleware Laravel et comment l'utiliser Comment fonctionne le middleware Laravel et comment l'utiliser Aug 02, 2023 am 10:13 AM

Le principe de fonctionnement et les compétences d'utilisation du middleware Laravel 1. Introduction Dans le framework Laravel, le middleware est une fonction très importante qui peut être utilisée pour exécuter certaines fonctions avant ou après que la requête atteigne la route de l'application. Le middleware fournit non seulement un moyen concis et flexible de gérer les demandes, mais peut également être utilisé pour gérer une série d'opérations telles que l'authentification, le contrôle des autorisations et la journalisation. Cet article présentera le principe de fonctionnement et les compétences d'utilisation du middleware Laravel, et fournira des exemples de code pour illustrer. 2. Le principe de fonctionnement du middleware est en L

Comprendre le fonctionnement des iframes : Comment ça marche ? Comprendre le fonctionnement des iframes : Comment ça marche ? Jan 06, 2024 am 09:24 AM

À l’intérieur de l’iframe : Comment ça marche ? Introduction : dans la conception Web moderne, nous utilisons souvent des éléments iframe pour intégrer d'autres pages Web ou afficher du contenu provenant d'autres domaines. Alors, comment fonctionnent les iframes ? Cet article révélera le fonctionnement de l'iframe à travers des exemples de code détaillés. 1. Qu'est-ce qu'une iframe ? iframe (InlineFrame) est un élément HTML qui peut intégrer d'autres pages Web dans une page Web ou afficher du contenu provenant d'autres domaines. Passer

Comment résoudre les problèmes de concurrence Java Comment résoudre les problèmes de concurrence Java Jun 30, 2023 am 08:24 AM

Comment résoudre les problèmes de concurrence de code rencontrés en Java Introduction : En programmation Java, faire face à des problèmes de concurrence est une situation très courante. Les problèmes de concurrence font référence au moment où plusieurs threads accèdent et exploitent des ressources partagées en même temps, ce qui peut conduire à des résultats imprévisibles. Ces problèmes peuvent inclure des courses de données, des blocages, des livelocks, etc. Cet article présentera quelques méthodes courantes et efficaces pour résoudre les problèmes de concurrence en Java. 1. Contrôle de synchronisation : mot-clé synchronisé : le mot-clé synchronisé est le mot-clé de synchronisation le plus basique en Java

Comment mettre en œuvre les compétences de base en programmation multithread JAVA Comment mettre en œuvre les compétences de base en programmation multithread JAVA Nov 08, 2023 pm 01:30 PM

En tant qu'excellent langage de programmation, Java est largement utilisé dans le développement au niveau des entreprises. Parmi eux, la programmation multithread est l'un des contenus essentiels de Java. Dans cet article, nous présenterons comment utiliser les techniques de programmation multithread en Java, ainsi que des exemples de code spécifiques. Façons de créer des threads Il existe deux façons de créer des threads en Java, à savoir hériter de la classe Thread et implémenter l'interface Runnable. La manière d'hériter de la classe Thread est la suivante : publicclassExampleThreadext

Analyse approfondie du mécanisme de verrouillage mutex dans Golang Analyse approfondie du mécanisme de verrouillage mutex dans Golang Jan 24, 2024 am 08:57 AM

Explication détaillée du mécanisme d'implémentation du verrou dans Golang Dans la programmation multithread, afin d'assurer la sécurité des ressources partagées, nous devons souvent utiliser des verrous. Le but du verrou est de garantir qu'un seul thread peut accéder aux ressources partagées en même temps, évitant ainsi les erreurs causées par la concurrence des données. Dans Golang, certains mécanismes de verrouillage intégrés sont fournis, tels que le mutex (mutex), le verrouillage en lecture-écriture (RWMutex), etc. Cet article présentera en détail le mécanisme d'implémentation du verrouillage dans Golang et fournira des exemples de code spécifiques. 1. Verrouillage Mutex (mutex

Analyse des avantages et des inconvénients de l'héritage Golang et suggestions d'utilisation Analyse des avantages et des inconvénients de l'héritage Golang et suggestions d'utilisation Dec 30, 2023 pm 01:20 PM

Analyse des avantages et des inconvénients de l'héritage Golang et guide d'utilisation Introduction : Golang est un langage de programmation open source présentant les caractéristiques de simplicité, d'efficacité et de concurrence. En tant que langage de programmation orienté objet, Golang permet la réutilisation du code par composition plutôt que par héritage. L'héritage est un concept couramment utilisé dans la programmation orientée objet qui permet à une classe d'hériter des propriétés et des méthodes d'une autre classe. Cependant, dans Golang, l'héritage n'est pas une méthode de programmation privilégiée, mais la réutilisation du code est obtenue grâce à la combinaison d'interfaces. Dans cet article, nous

Une analyse approfondie du fonctionnement des verrous à Golang Une analyse approfondie du fonctionnement des verrous à Golang Dec 28, 2023 pm 01:50 PM

Analyse approfondie du fonctionnement des verrous dans Golang Introduction : En programmation concurrente, il est crucial d'éviter les conditions de concurrence. Afin d'assurer la sécurité des threads, Golang fournit un riche mécanisme de verrouillage. Cet article fournira une analyse approfondie du fonctionnement des verrous dans Golang et fournira des exemples de code spécifiques. 1. Verrouillage Mutex (Mutex) Le verrouillage Mutex est le mécanisme de verrouillage le plus couramment utilisé. Golang fournit le type Mutex dans le package de synchronisation pour l'implémenter. Mutex propose deux méthodes : L

Comment résoudre les problèmes de contrôle de concurrence des threads en Java Comment résoudre les problèmes de contrôle de concurrence des threads en Java Oct 09, 2023 am 10:54 AM

Comment résoudre le problème du contrôle de concurrence des threads en Java Java est un langage de programmation couramment utilisé et sa programmation simultanée est l'une de ses fonctionnalités importantes. Cependant, dans la programmation multithread, la question du contrôle de concurrence entre les threads est un défi courant. Afin de garantir que plusieurs threads peuvent fonctionner correctement ensemble, nous devons prendre certaines mesures pour résoudre le problème du contrôle de la concurrence des threads. Cet article présentera quelques méthodes couramment utilisées et des exemples de code spécifiques pour aider les lecteurs à mieux comprendre et résoudre les problèmes de contrôle de concurrence des threads en Java. Utiliser le mécanisme de verrouillage Le verrouillage est un mécanisme de synchronisation

See all articles