Maison développement back-end Golang Comment utiliser les verrous dans Go ?

Comment utiliser les verrous dans Go ?

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

En programmation concurrente, le verrouillage est un mécanisme utilisé pour protéger les ressources partagées. Dans le langage Go, les verrous sont l'un des outils importants pour parvenir à la concurrence. Il garantit que lorsque plusieurs coroutines accèdent simultanément aux ressources partagées, une seule coroutine peut lire ou modifier ces ressources. Cet article présentera l'utilisation des verrous en langage Go pour aider les lecteurs à mieux comprendre la programmation simultanée.

  1. Mutual Exclusion Lock

Mutual Exclusion Lock est le mécanisme de verrouillage le plus couramment utilisé dans le langage Go. Cela garantit qu’une seule coroutine peut accéder à la section critique en même temps. En termes simples, un verrou mutex garantit qu'une seule coroutine peut y accéder en même temps en encapsulant la ressource partagée dans la section critique du verrouillage.

Utiliser les verrous mutex en langage Go est très simple. Nous pouvons utiliser le type Mutex dans le package de synchronisation pour créer un verrou mutex :

import "sync"

var mutex = &sync.Mutex{}
Copier après la connexion

Après cela, à l'emplacement où les ressources partagées doivent être protégées, nous pouvons utiliser le code suivant pour obtenir le verrou :

mutex.Lock()
defer mutex.Unlock()
Copier après la connexion
# 🎜🎜#Il convient de noter que les verrous mutex ne prennent pas en charge la réentrée. Si une coroutine a déjà acquis le verrou, tenter à nouveau d’acquérir le verrou entraînera un blocage. Par conséquent, nous utilisons généralement l'instruction defer pour libérer automatiquement le verrou à la fin de la coroutine.

Ce qui suit est un exemple d'utilisation d'un 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)
}
Copier après la connexion

Dans cet exemple, nous utilisons un mutex pour protéger un compteur. 1 000 coroutines exécutent la fonction d'incrémentation en même temps, en ajoutant 1 au compteur à chaque fois. Grâce à l'utilisation de verrous mutex, le programme peut afficher correctement la valeur finale du compteur.

    Read-Write Lock
Dans un environnement multi-coroutines, le verrouillage en lecture-écriture (Read-Write Lock) peut être meilleur que le mutex verrouillage. En revanche, il peut rester efficace lorsque plusieurs coroutines lisent simultanément une ressource partagée, mais nécessite toujours un accès mutuellement exclusif lorsqu'il y a des opérations d'écriture.

Les verrous en lecture-écriture se composent de deux types de verrous : les verrous en lecture et les verrous en écriture. Les verrous en lecture permettent à plusieurs coroutines d'accéder aux ressources partagées en même temps, mais les verrous en écriture garantissent qu'une seule coroutine peut y accéder en même temps.

En langage Go, vous pouvez utiliser le type RWMutex dans le package de synchronisation pour créer un verrou en lecture-écriture.

import "sync"

var rwlock = &sync.RWMutex{}
Copier après la connexion

Les méthodes d'acquisition du verrouillage en lecture et du verrouillage en écriture sont différentes. Voici quelques utilisations courantes :

    Acquérir le verrou en lecture : rwlock.RLock()
  • Libérer le verrou en lecture : rwlock.RUnlock()
  • # 🎜🎜#Acquérir le verrou en écriture : rwlock.Lock()
  • Libérer le verrou en écriture : rwlock.Unlock()
  • Ce qui suit est un exemple d'utilisation de la lecture write lock :
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()
}
Copier après la connexion

Dans cet exemple, nous avons ouvert simultanément 10 coroutines pour écrire des données sur le compteur et 5 coroutines pour lire les données du compteur. En utilisant des verrous en lecture-écriture, les programmes peuvent lire les ressources partagées de manière efficace tout en garantissant l'atomicité des opérations d'écriture.

Opérations atomiques
  1. En langage Go, vous pouvez également utiliser des opérations atomiques pour vous assurer que le fonctionnement des primitives de synchronisation est atomique. Les opérations atomiques ne nécessitent pas de verrouillage et sont donc plus efficaces que les verrous dans certaines situations.

Le langage Go a plusieurs fonctions d'opération atomique intégrées, vous pouvez vous référer à la documentation officielle. Voici deux fonctions d’opération atomique couramment utilisées : atomic.Add et atomic.Load.

atomic.Add : effectue une opération d'addition atomique sur un entier.
  • atomic.Load : Lit la valeur d'un entier de manière atomique.
  • Ce qui suit est un exemple :
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()
}
Copier après la connexion

Dans cet exemple, nous utilisons la fonction atomic.Add pour effectuer des opérations d'addition atomique sur le compteur, et l'atomique .Load fonction atomiquement Lire la valeur du compteur manuellement. En utilisant des opérations atomiques, nous pouvons éviter la surcharge des verrous et obtenir une programmation simultanée plus efficace.

Summary
  1. Le langage Go fournit une variété de mécanismes de synchronisation, notamment des verrous mutex, des verrous en lecture-écriture et des opérations atomiques. L'utilisation de mécanismes de synchronisation appropriés dans la programmation simultanée est essentielle pour garantir que les programmes fonctionnent correctement et efficacement. Afin d'éviter une impasse, nous devons soigneusement réfléchir au mécanisme de verrouillage le plus adapté aux ressources partagées actuelles. En langage Go, la manière d’utiliser les verrous est très simple. Il convient de noter que le temps de maintien du verrou doit être réduit autant que possible pour éviter de réduire les performances du programme.

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)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines 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 utiliser les constantes dans Go ? Comment utiliser les constantes dans Go ? May 11, 2023 pm 04:52 PM

Dans Go, les constantes sont des identifiants qui conservent une valeur fixe et ne changent pas tout au long de l'exécution du programme. Les constantes dans Go sont déclarées à l'aide du mot-clé const. Dans cet article, nous explorerons comment utiliser les constantes dans Go. Comment déclarer une constante Déclarer une constante dans Go est très simple, il suffit d'utiliser le mot-clé const. Le format est le suivant : constidentifier[type]=value où identifier est le nom de la constante

Comment implémenter le regroupement d'itinéraires en langage Go Comment implémenter le regroupement d'itinéraires en langage Go Dec 17, 2023 pm 11:09 PM

Le langage Go est un langage de programmation simple et efficace qui est également largement utilisé dans le domaine du développement web. Dans le développement Web, le routage est un élément essentiel. Le regroupement de routage est une fonction de routage plus avancée, qui peut rendre le code plus clair et concis, et améliorer la lisibilité et la maintenabilité du code. Cet article présentera en détail comment implémenter le regroupement de routage dans le langage Go, à la fois du point de vue du principe et de l'implémentation du code. 1. Principe de regroupement Le regroupement d'itinéraires équivaut à regrouper et gérer des itinéraires présentant des caractéristiques similaires. Par exemple, nous pouvons convertir toutes les API

Expérience pratique : bonnes pratiques dans les projets de développement du langage Go Expérience pratique : bonnes pratiques dans les projets de développement du langage Go Nov 02, 2023 pm 01:07 PM

Résumé : Cet article présente principalement les meilleures pratiques dans les projets de développement du langage Go. En expliquant l'expérience en matière de conception de structure de projet, de gestion des erreurs, de traitement simultané, d'optimisation des performances et de tests, il aide les développeurs à mieux faire face aux défis des projets réels. 1. Conception de la structure du projet Avant de démarrer un projet en langage Go, une bonne conception de la structure du projet est cruciale. Une bonne structure de projet peut améliorer l'efficacité de la collaboration en équipe et mieux gérer le code et les ressources du projet. Voici quelques bonnes pratiques pour la structure du projet : Séparez le code autant que possible

Comment optimiser la sérialisation et la désérialisation JSON dans le développement du langage Go Comment optimiser la sérialisation et la désérialisation JSON dans le développement du langage Go Jul 01, 2023 pm 09:01 PM

Comment optimiser la sérialisation et la désérialisation JSON dans le développement du langage Go. Dans le développement du langage Go, JSON (JavaScriptObjectNotation) est un format de sérialisation et de désérialisation fréquemment utilisé. Il est concis, lisible et facile à interagir sur différentes plates-formes. Cependant, lors du traitement de données volumineuses ou de scénarios de concurrence élevée, les performances de sérialisation et de désérialisation JSON peuvent devenir un goulot d'étranglement en termes de performances. Cet article présentera quelques méthodes d'optimisation pour la sérialisation et la désérialisation JSON dans le développement du langage Go.

Quels sont les mécanismes de synchronisation en langage go ? Quels sont les mécanismes de synchronisation en langage go ? Jul 31, 2023 pm 05:35 PM

Les mécanismes de synchronisation du langage Go incluent : 1. Le verrouillage mutex, qui est l'une des primitives de synchronisation les plus élémentaires de Go ; 2. Le verrouillage mutex en lecture et en écriture, qui peut améliorer les performances de concurrence. 3. Les variables de condition, utilisées entre plusieurs goroutines. Primitives de synchronisation ; communication ; 4. Canaux, le principal mécanisme de communication entre les goroutines ; 5. Opérations atomiques, un mécanisme pour des opérations simples qui assurent la sécurité de la concurrence 6. Une fois, utilisé pour garantir qu'une opération n'est exécutée qu'une primitive de synchronisation unique ;

Comment utiliser le langage Go pour la pratique de la parallélisation de code Comment utiliser le langage Go pour la pratique de la parallélisation de code Aug 02, 2023 am 09:12 AM

Comment utiliser le langage Go pour la pratique de la parallélisation de code Dans le développement de logiciels modernes, les performances sont une considération très importante. Afin d'améliorer l'efficacité de l'exécution du code, nous pouvons utiliser la technologie de programmation parallèle. En tant que langage de programmation concurrent, le langage Go dispose d'une multitude d'outils et de fonctionnalités de parallélisation qui peuvent nous aider à réaliser une bonne parallélisation du code. Cet article explique comment utiliser le langage Go pour la pratique de la parallélisation de code, du traitement simultané de base à l'optimisation d'algorithmes parallèles complexes. Traitement simultané de base Le traitement simultané fait référence à l'exécution de plusieurs tâches en même temps.

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

See all articles