Maison développement back-end Golang Est-ce que la langue prend en charge les verrous ?

Est-ce que la langue prend en charge les verrous ?

Dec 06, 2022 pm 06:32 PM
go golang go语言

Le langage Go prend en charge les verrous. La bibliothèque standard du langage go fournit deux types de verrous : 1. Le verrouillage mutex (sync.Mutex), qui peut protéger une ressource contre les conflits provoqués par des opérations simultanées et entraînant des données inexactes. 2. Le verrouillage en lecture-écriture (sync.RWMutex) ; Lorsque le verrou de lecture est occupé, l'écriture est bloquée, mais la lecture n'est pas bloquée. Dans un environnement avec plus de lectures et moins d'écritures, les mutex en lecture-écriture peuvent être utilisés en premier.

Est-ce que la langue prend en charge les verrous ?

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

La bibliothèque standard du langage go fournit deux verrous, l'un est un verrou mutex et l'autre est un verrou en lecture-écriture. Le package de synchronisation du package de langue Go fournit deux types de verrouillage : le verrouillage mutex (sync.Mutex) et le verrouillage en lecture-écriture (sync.RWMutex).

Le Mutex est le type de verrouillage le plus simple, et il est également relativement violent Lorsqu'une goroutine obtient un Mutex, les autres goroutines ne peuvent qu'attendre que la goroutine libère le Mutex.

RWMutex est relativement convivial et est un modèle classique d'écriture une fois, lecture multiple. Lorsque le verrou de lecture est occupé, l'écriture sera bloquée, mais la lecture ne sera pas bloquée. Autrement dit, plusieurs goroutines peuvent acquérir le verrou de lecture en même temps (appelant la méthode RLock() pendant le verrouillage d'écriture (appelant le Lock) ; ()) empêchera toute autre goroutine (que ce soit en lecture ou en écriture) d'entrer, le verrou entier équivaut à appartenir exclusivement à la goroutine. À en juger par l'implémentation de RWMutex, le type RWMutex combine en fait Mutex :

type RWMutex struct {
    w Mutex
    writerSem uint32
    readerSem uint32
    readerCount int32
    readerWait int32
}
Copier après la connexion

Pour ces deux types de verrous, tout Lock() ou RLock() doit s'assurer qu'il existe un appel Unlock() ou RUnlock() correspondant, sinon ceci peut provoquer l'épuisement de toutes les goroutines en attente du verrou, voire provoquer un blocage. [Recommandations associées : Tutoriel vidéo Go, Enseignement de la programmation] Le modèle d'utilisation typique du

lock est le suivant :

package main
import (
    "fmt"
    "sync"
)
var (
    // 逻辑中使用的某个变量
    count int
    // 与变量对应的使用互斥锁
    countGuard sync.Mutex
)
func GetCount() int {
    // 锁定
    countGuard.Lock()
    // 在函数退出时解除锁定
    defer countGuard.Unlock()
    return count
}
func SetCount(c int) {
    countGuard.Lock()
    count = c
    countGuard.Unlock()
}
func main() {
    // 可以进行并发安全的设置
    SetCount(1)
    // 可以进行并发安全的获取
    fmt.Println(GetCount())
}
Copier après la connexion

La description du code est la suivante :

  • La ligne 10 est une variable utilisée dans un certaine étape logique, peu importe qu'il s'agisse d'une variable au niveau du package ou d'un champ membre de la structure.

  • Ligne 13, en général, il est recommandé de définir la granularité du mutex la plus petite possible pour réduire le temps d'attente pour l'accès partagé. Ici, l'auteur nomme habituellement la variable mutex au format suivant :

变量名+Guard
Copier après la connexion

pour indiquer que le mutex est utilisé pour protéger cette variable.

  • La ligne 16 est une encapsulation de fonction pour obtenir la valeur du comptage Grâce à cette fonction, la variable count est accessible simultanément et en toute sécurité.

  • Ligne 19, essayez de verrouiller le mutex countGuard. Une fois countGuard verrouillé, si une autre goroutine tente de continuer le verrouillage, elle sera bloquée jusqu'à ce que countGuard soit déverrouillé.

  • La ligne 22 utilise defer pour retarder l'appel de déverrouillage de countGuard. L'opération de déverrouillage se produira au retour de la fonction GetCount().

  • À la ligne 27, lors de la définition de la valeur de comptage, countGuard est également utilisé pour effectuer des opérations de verrouillage et de déverrouillage afin de garantir que le processus de modification de la valeur de comptage est un processus atomique et qu'aucun conflit d'accès simultané ne se produira.

Dans un environnement où il y a beaucoup de lecture et peu d'écriture, vous pouvez privilégier l'utilisation d'un mutex en lecture-écriture (sync.RWMutex), qui est plus efficace qu'un mutex. RWMutex dans le package sync fournit une encapsulation des mutex en lecture-écriture.

Nous avons modifié une partie du code dans l'exemple de mutex en un mutex en lecture-écriture, voir le code ci-dessous :

var (
    // 逻辑中使用的某个变量
    count int
    // 与变量对应的使用互斥锁
    countGuard sync.RWMutex
)
func GetCount() int {
    // 锁定
    countGuard.RLock()
    // 在函数退出时解除锁定
    defer countGuard.RUnlock()
    return count
}
Copier après la connexion

La description du code est la suivante :

  • Ligne 6, lors de la déclaration de countGuard, depuis sync.Mutex mutex Le verrou est remplacé par le verrou mutex en lecture-écriture sync.RWMutex.

  • Ligne 12, le processus d'obtention du décompte est un processus de lecture des données de décompte, qui convient aux verrous mutex en lecture et en écriture. Dans cette ligne, remplacez countGuard.Lock() par countGuard.RLock() pour marquer le mutex en lecture-écriture comme lu. Si une autre goroutine accède simultanément à countGuard et appelle countGuard.RLock() en même temps, aucun blocage ne se produira.

  • Ligne 15, correspondant au verrouillage du mode lecture, utilisez le mode lecture pour déverrouiller.

Remarque spéciale :

  • Le verrou de sync.Mutex ne peut pas être imbriqué

  • Le RLock() de sync.RWMutex peut être imbriqué

  • sync.RWMutex mu.Lock() ne peut pas être imbriqué

  • Le mu.Lock() de
  • sync.RWMutex ne peut pas être imbriqué dans mu.RLock()

Pour plus de connaissances sur la programmation, veuillez visiter : Vidéo de programmation  ! !

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

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

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)

Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Quelles bibliothèques sont utilisées pour les opérations du numéro de point flottantes en Go? Apr 02, 2025 pm 02:06 PM

La bibliothèque utilisée pour le fonctionnement du numéro de point flottante dans le langage go présente comment s'assurer que la précision est ...

Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Quel est le problème avec le fil de file d'attente dans GO's Crawler Colly? Apr 02, 2025 pm 02:09 PM

Problème de threading de file d'attente dans Go Crawler Colly explore le problème de l'utilisation de la bibliothèque Crawler Crawler dans le langage Go, les développeurs rencontrent souvent des problèmes avec les threads et les files d'attente de demande. � ...

Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Dans Go, pourquoi les chaînes d'impression avec println et string () ont-elles des effets différents? Apr 02, 2025 pm 02:03 PM

La différence entre l'impression de chaîne dans le langage go: la différence dans l'effet de l'utilisation de fonctions println et string () est en Go ...

Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Comment résoudre le problème de conversion de type user_id lors de l'utilisation du flux redis pour implémenter les files d'attente de messages dans le langage Go? Apr 02, 2025 pm 04:54 PM

Le problème de l'utilisation de Redessstream pour implémenter les files d'attente de messages dans le langage GO consiste à utiliser le langage GO et redis ...

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Apr 02, 2025 pm 05:09 PM

Que dois-je faire si les étiquettes de structure personnalisées à Goland ne sont pas affichées? Lorsque vous utilisez Goland pour le développement du langage GO, de nombreux développeurs rencontreront des balises de structure personnalisées ...

Objectif de Golang: Construire des systèmes efficaces et évolutifs Objectif de Golang: Construire des systèmes efficaces et évolutifs Apr 09, 2025 pm 05:17 PM

GO Language fonctionne bien dans la construction de systèmes efficaces et évolutifs. Ses avantages incluent: 1. Haute performance: compilé en code machine, vitesse de course rapide; 2. Programmation simultanée: simplifier le multitâche via les goroutines et les canaux; 3. Simplicité: syntaxe concise, réduction des coûts d'apprentissage et de maintenance; 4. Plate-forme multipliée: prend en charge la compilation multiplateforme, déploiement facile.

Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Quelles bibliothèques de GO sont développées par de grandes entreprises ou fournies par des projets open source bien connus? Apr 02, 2025 pm 04:12 PM

Quelles bibliothèques de GO sont développées par de grandes entreprises ou des projets open source bien connus? Lors de la programmation en Go, les développeurs rencontrent souvent des besoins communs, ...

Comment résoudre le problème des contraintes de type de fonction générique de Golang en cours de suppression automatique dans VSCODE? Comment résoudre le problème des contraintes de type de fonction générique de Golang en cours de suppression automatique dans VSCODE? Apr 02, 2025 pm 02:15 PM

La suppression automatique des contraintes de type de fonction générique Golang dans les utilisateurs de VScode peut rencontrer un problème étrange lors de l'écriture de code Golang à l'aide de VScode. quand...

See all articles