Maison développement back-end Golang Partage pratique de la synchronisation et de la protection du verrouillage des fonctions Golang

Partage pratique de la synchronisation et de la protection du verrouillage des fonctions Golang

May 16, 2023 am 09:04 AM
同步 golang函数 锁保护

Avec le développement d'Internet et la vulgarisation du cloud computing et de la technologie du big data, les systèmes logiciels modernes doivent traiter de plus en plus de données, et en même temps, ils doivent également garantir l'efficacité et la fiabilité du système. . Dans ce contexte, les performances et les caractéristiques techniques du langage deviennent particulièrement importantes. Parmi eux, Golang, en tant que langage de programmation efficace, léger et hautement simultané, a reçu de plus en plus d'attention et d'applications ces dernières années. Cet article discutera des pratiques de synchronisation et de protection contre le verrouillage des fonctions Golang et fournira un partage d'expérience utile pour les développeurs Golang.

  1. Les principes et méthodes de synchronisation

La synchronisation est la clé de la collaboration entre plusieurs threads ou processus. Son objectif principal est d'assurer divers corrects. accès et protection des ressources. Dans Golang, les principales méthodes de synchronisation sont les suivantes :

1.1 Verrouillage Mutex (sync.Mutex)

Le verrouillage Mutex est le mécanisme de synchronisation le plus basique de Golang. Son rôle principal est de garantir qu'une seule goroutine puisse accéder aux ressources partagées en même temps. Lorsqu'une goroutine demandera la ressource, elle tentera d'acquérir le verrou. Si elle ne peut pas l'obtenir, elle sera bloquée jusqu'à ce que le verrou soit libéré. Voici un exemple d'implémentation simple d'un mutex :

package main

import (
    "fmt"
    "sync"
)

var count int
var mu sync.Mutex // 互斥锁

func main() {
    for i := 0; i < 10; i++ {
        go increase()
    }

    // 等待所有goroutine执行完成
    for {
        mu.Lock()
        if count == 10 {
            mu.Unlock()
            break
        }
        mu.Unlock()
    }

    fmt.Println("count:", count)
}

func increase() {
    mu.Lock()
    defer mu.Unlock()
    count += 1
}
Copier après la connexion
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons un mutex pour assurer le fonctionnement atomique du nombre de variables partagées. À l'intérieur de la fonction d'augmentation, nous acquérons d'abord le verrou mutex, puis effectuons une opération d'incrémentation sur le compte, et enfin libérons le verrou. De cette façon, nous pouvons empêcher les accès simultanés au comptage de provoquer des résultats inattendus.

1.2 Verrouillage en lecture-écriture (sync.RWMutex)

RWMutex est un verrou mutex avancé qui prend en charge plusieurs opérations de lecture simultanément, mais n'autorise qu'une seule opération d'écriture. Lors de sa mise en œuvre, il organise les opérations de lecture de plusieurs goroutines en basculant entre les modes de lecture et d'écriture, améliorant ainsi les performances de concurrence. Voici un exemple d'implémentation simple d'un verrou en lecture-écriture :

package main

import (
    "fmt"
    "sync"
)

var count int
var mu sync.RWMutex // 读写锁

func main() {
    for i := 0; i < 10; i++ {
        go increase()
    }

    // 等待所有goroutine执行完成
    for {
        mu.RLock()
        if count == 10 {
            mu.RUnlock()
            break
        }
        mu.RUnlock()
    }

    fmt.Println("count:", count)
}

func increase() {
    mu.Lock()
    defer mu.Unlock()
    count += 1
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons des verrous en lecture-écriture pour garantir les opérations atomiques du nombre de variables partagées. À l'intérieur de la fonction d'augmentation, nous acquérons d'abord le verrou en écriture du verrou en lecture-écriture, puis effectuons une opération d'incrémentation sur le compte, et enfin libérons le verrou. De cette façon, nous pouvons empêcher les accès simultanés au comptage de provoquer des résultats inattendus.

  1. La pratique de la protection par verrouillage

En plus du mécanisme de synchronisation, Golang propose également certaines pratiques de protection par verrouillage pour garantir l'intégrité des données et sécurité. Ce qui suit est une introduction détaillée à quelques méthodes pratiques :

2.1 Fonctionnement atomique (sync/atomic)

Le fonctionnement atomique est une technologie qui peut assurer la synchronisation des données sans verrouillage. Golang fournit une série de fonctions d'opération atomiques pour implémenter les fonctions de base de synchronisation de la mémoire. Voici un exemple :

package main

import (
    "fmt"
    "sync/atomic"
)

var count int32

func main() {
    for i := 0; i < 10; i++ {
        go increase()
    }

    // 等待所有goroutine执行完成
    for {
        if atomic.LoadInt32(&count) == 10 {
            break
        }
    }

    fmt.Println("count:", count)
}

func increase() {
    atomic.AddInt32(&count, 1)
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons la fonction d'opération atomique atomic.AddInt32() pour garantir que l'opération d'incrémentation de compte est atomique, évitant ainsi les conditions de concurrence. Les données sont anormales. .

2.2 Communication par canal

Channel est un outil de synchronisation important dans Golang. Il garantit l'exactitude des données grâce à la communication entre les goroutines. Le canal est quelque peu similaire à un tube Unix, qui permet à une goroutine d'envoyer un bloc de données à une autre goroutine ou de recevoir un bloc de données. Voici un exemple :

package main

import (
    "fmt"
)

func main() {
    ch := make(chan int)
    go increase(ch)

    // 接收所有增加的值
    count := 0
    for i := 0; i < 10; i++ {
       count += <-ch
    }

    fmt.Println("count:", count)
}

func increase(ch chan int) {
    for i := 0; i < 10; i++ {
       ch <- 1
    }
    close(ch)
}
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons des canaux pour éviter les conditions de concurrence provoquées par l'accès simultané au nombre de données partagées par plusieurs goroutines. À l'intérieur de la fonction d'augmentation, nous envoyons 10 1 à la fonction principale via le canal pour effectuer l'opération de comptage. À l'intérieur de la fonction principale, nous recevons les données dans le canal via une boucle et les accumulons dans la variable count, évitant ainsi les exceptions de données causées par des conditions de concurrence.

2.3 L'instruction defer de sync.Mutex

Dans Golang, les verrous mutex utilisent souvent l'instruction defer pour garantir la libération correcte du verrou. L'instruction defer est un mécanisme qui provoque l'exécution de l'instruction au retour de la fonction. Elle peut éviter les exceptions du programme causées par l'oubli de libérer le verrou. Voici un exemple :

package main

import (
    "fmt"
    "sync"
)

var count int
var mu sync.Mutex // 互斥锁

func main() {
    for i := 0; i < 10; i++ {
        go increase()
    }

    // 等待所有goroutine执行完成
    for {
        mu.Lock()
        if count == 10 {
            mu.Unlock()
            break
        }
        mu.Unlock()
    }

    fmt.Println("count:", count)
}

func increase() {
    mu.Lock()
    defer mu.Unlock()
    count += 1
}
Copier après la connexion
Copier après la connexion

Dans l'exemple ci-dessus, nous utilisons l'instruction defer pour garantir la libération correcte du verrou mutex. Lorsque la goroutine quitte la fonction d'augmentation, l'instruction defer libère automatiquement le verrou pour garantir que la prochaine fois que le verrou sera acquis, il pourra être exécuté avec succès.

Conclusion

Ce qui précède concerne le partage des pratiques de synchronisation et de protection de verrouillage des fonctions Golang. Grâce à l'application de verrous mutex, de verrous en lecture-écriture, d'opérations atomiques, de communication de canal et d'instructions différées, nous pouvons mieux garantir l'exactitude et la sécurité des données dans la programmation multithread Golang. Que ce soit dans les systèmes de cloud computing à grande échelle, les systèmes distribués ou les systèmes de traitement de données en temps réel, ces technologies de synchronisation et de protection contre le verrouillage revêtent une grande importance.

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)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
3 Il y a quelques semaines 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)

Résolvez le problème de la lecture simultanée d'écouteurs et de haut-parleurs dans Win11 Résolvez le problème de la lecture simultanée d'écouteurs et de haut-parleurs dans Win11 Jan 06, 2024 am 08:50 AM

De manière générale, nous n'avons besoin d'utiliser qu'un seul casque ou haut-parleur en même temps. Cependant, certains amis ont signalé que dans le système Win11, ils ont rencontré le problème du son des écouteurs et des haut-parleurs en même temps. désactivez-le dans le panneau Realtek et tout ira bien, jetons un œil ci-dessous. Que dois-je faire si mes écouteurs et mes haut-parleurs sonnent ensemble dans Win11 ? 1. Recherchez et ouvrez d'abord le "Panneau de configuration" sur le bureau 2. Accédez au panneau de configuration, recherchez et ouvrez "Matériel et son" 3. Recherchez ensuite le ". Realtek High Definition" avec une icône de haut-parleur. Audio Manager" 4. Sélectionnez "Haut-parleurs" et cliquez sur "Panneau arrière" pour entrer les paramètres des haut-parleurs. 5. Après ouverture, nous pouvons voir le type d'appareil. Si vous souhaitez éteindre les écouteurs, décochez « Écouteurs ».

Un ou plusieurs éléments du dossier que vous avez synchronisé ne correspondent pas à l'erreur Outlook Un ou plusieurs éléments du dossier que vous avez synchronisé ne correspondent pas à l'erreur Outlook Mar 18, 2024 am 09:46 AM

Lorsque vous constatez qu'un ou plusieurs éléments de votre dossier de synchronisation ne correspondent pas au message d'erreur dans Outlook, cela peut être dû au fait que vous avez mis à jour ou annulé des éléments de réunion. Dans ce cas, vous verrez un message d'erreur indiquant que votre version locale des données est en conflit avec la copie distante. Cette situation se produit généralement dans l'application de bureau Outlook. Un ou plusieurs éléments du dossier que vous avez synchronisé ne correspondent pas. Pour résoudre le conflit, ouvrez les projets et retentez l'opération. Réparer Un ou plusieurs éléments dans les dossiers synchronisés ne correspondent pas à l'erreur Outlook Dans la version de bureau d'Outlook, vous pouvez rencontrer des problèmes lorsque des éléments du calendrier local entrent en conflit avec la copie du serveur. Heureusement, il existe des moyens simples d’aider

Conseils pour appliquer les valeurs des paramètres par défaut des fonctions Golang Conseils pour appliquer les valeurs des paramètres par défaut des fonctions Golang May 15, 2023 pm 11:54 PM

Golang est un langage de programmation moderne doté de nombreuses fonctionnalités uniques et puissantes. L'un d'eux est la technique consistant à utiliser les valeurs par défaut pour les paramètres de fonction. Cet article explique comment utiliser cette technique et comment optimiser votre code. 1. Quelles sont les valeurs par défaut des paramètres de fonction ? La valeur par défaut du paramètre de fonction fait référence à la définition d'une valeur par défaut pour son paramètre lors de la définition d'une fonction, de sorte que lorsque la fonction est appelée, si aucune valeur n'est transmise au paramètre, la valeur par défaut sera utilisée comme valeur du paramètre. Voici un exemple simple : funcmyFunction(namestr

Migration et synchronisation des données MySQL : comment réaliser la migration et la synchronisation des données MySQL entre plusieurs serveurs Migration et synchronisation des données MySQL : comment réaliser la migration et la synchronisation des données MySQL entre plusieurs serveurs Jun 15, 2023 pm 07:48 PM

MySQL est un système de gestion de bases de données relationnelles open source très populaire, largement utilisé dans diverses applications Web, systèmes d'entreprise, etc. Dans les scénarios d'applications métier modernes, la plupart des bases de données MySQL doivent être déployées sur plusieurs serveurs pour offrir une disponibilité et des performances supérieures, ce qui nécessite une migration et une synchronisation des données MySQL. Cet article explique comment implémenter la migration et la synchronisation des données MySQL entre plusieurs serveurs. 1. Migration de données MySQL La migration de données MySQL fait référence à la migration de données sur le serveur MySQL.

Apprenez à synchroniser le presse-papiers Win10 avec votre téléphone mobile Apprenez à synchroniser le presse-papiers Win10 avec votre téléphone mobile Jan 06, 2024 am 09:18 AM

Une fonction très utile du presse-papiers Win10 est la fonction de stockage cloud multi-appareils, qui est très utile et peut aider les utilisateurs à copier et coller simultanément sur des appareils PC et des appareils mobiles. La méthode de configuration est très simple, il suffit de la définir dans le presse-papiers du système. Synchroniser le presse-papiers Win10 avec le téléphone mobile 1. Cliquez d'abord sur Démarrer dans le coin inférieur gauche pour entrer les paramètres. 2. Cliquez ensuite sur « Système ». 3. Sélectionnez « Presse-papiers » sur la gauche. 4. Enfin, cliquez sur Connexion dans « Synchronisation multi-appareils » à droite, puis sélectionnez votre téléphone mobile.

Application et implémentation sous-jacente de la réflexion et de l'assertion de type dans les fonctions Golang Application et implémentation sous-jacente de la réflexion et de l'assertion de type dans les fonctions Golang May 16, 2023 pm 12:01 PM

Application et implémentation sous-jacente de la réflexion de fonction Golang et de l'assertion de type Dans la programmation Golang, la réflexion de fonction et l'assertion de type sont deux concepts très importants. La réflexion des fonctions nous permet d'appeler dynamiquement des fonctions au moment de l'exécution, et les assertions de type peuvent nous aider à effectuer des opérations de conversion de type lorsqu'il s'agit de types d'interface. Cet article discutera en profondeur de l'application de ces deux concepts et de leurs principes de mise en œuvre sous-jacents. 1. Réflexion de fonction La réflexion de fonction fait référence à l'obtention d'informations spécifiques sur la fonction lors de l'exécution du programme, telles que le nom de la fonction, le nombre de paramètres, le type de paramètre, etc.

Conseils pour une sortie élégante et un parcours de boucle hors des fonctions Golang Conseils pour une sortie élégante et un parcours de boucle hors des fonctions Golang May 16, 2023 pm 09:40 PM

En tant que langage de programmation offrant une efficacité de développement élevée et d'excellentes performances, les puissantes capacités fonctionnelles de Golang sont l'une de ses caractéristiques clés. Au cours du processus de développement, nous rencontrons souvent des situations dans lesquelles nous devons quitter une fonction ou effectuer une boucle. Cet article présentera les astuces de sortie gracieuse et de sortie de parcours de boucle des fonctions Golang. 1. Sortie en douceur d'une fonction Dans la programmation Golang, nous devons parfois quitter en douceur une fonction. Cette situation se produit généralement parce que nous rencontrons des erreurs dans la fonction ou que les résultats d'exécution de la fonction ne sont pas ceux attendus. Il y a les deux suivants

Comment sélectionner des dossiers spécifiques à synchroniser dans OneDrive sous Windows 11 Comment sélectionner des dossiers spécifiques à synchroniser dans OneDrive sous Windows 11 Apr 13, 2023 pm 04:22 PM

L'application OneDrive sur votre système stocke tous vos fichiers et dossiers dans le cloud. Mais parfois, les utilisateurs ne souhaitent pas que certains fichiers ou dossiers soient stockés et occupent un espace OneDrive limité à 5 Go sans abonnement. Pour ce faire, il existe un paramètre dans l'application OneDrive qui permet aux utilisateurs de sélectionner des fichiers ou des dossiers à synchroniser sur le cloud. Si vous recherchez également cela, cet article vous aidera à sélectionner les dossiers ou fichiers à synchroniser dans OneDrive sous Windows 11. Comment sélectionner certains dossiers à synchroniser dans OneDrive sous Windows 11 Remarque : assurez-vous que l'application OneDrive est connectée et synchronisée

See all articles