Maison  >  Article  >  développement back-end  >  Utilisez la fonction sync.Mutex dans Golang pour implémenter un code sécurisé par concurrence

Utilisez la fonction sync.Mutex dans Golang pour implémenter un code sécurisé par concurrence

WBOY
WBOYoriginal
2023-11-18 13:01:02553parcourir

Utilisez la fonction sync.Mutex dans Golang pour implémenter un code sécurisé par concurrence

Utilisez la fonction sync.Mutex dans Golang pour implémenter un code sécurisé contre la concurrence

Dans la programmation simultanée, lorsque plusieurs goroutines accèdent à des variables partagées en même temps, des conditions de course aux données peuvent survenir. Afin de garantir la cohérence et l'exactitude des données, nous pouvons utiliser des verrous mutex (Mutex) pour implémenter un code sécurisé pour la concurrence.

Golang fournit le package de synchronisation, qui contient le type Mutex. Grâce aux méthodes Lock() et Unlock() de Mutex, nous pouvons verrouiller et déverrouiller avant et après l'accès aux ressources partagées qui doivent être protégées.

Ci-dessous, nous utilisons un exemple de code simple pour montrer comment utiliser sync.Mutex pour implémenter un code sécurisé pour la concurrence.

package main

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

var (
    count int
    mutex sync.Mutex
)

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

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

func increment(wg *sync.WaitGroup) {
    mutex.Lock()
    defer mutex.Unlock()

    time.Sleep(time.Millisecond) // 模拟一些耗时操作

    count++
    wg.Done()
}

Dans le code ci-dessus, nous définissons un nombre de variables globales et un mutex de verrouillage mutex. 10 goroutines sont créées dans la fonction principale, et chaque goroutine appelle la fonction d'incrémentation.

Dans la fonction d'incrémentation, appelez d'abord mutex.Lock() pour obtenir le verrou mutex, puis effectuez certaines opérations sur les ressources partagées qui doivent être protégées. Ici, nous simulons une opération fastidieuse pour augmenter la complexité du code, et enfin appelez mutex Unlock() pour libérer le verrou mutex.

À mesure que le nombre de goroutines augmente, les opérations sur compte deviendront une ressource partagée pour un accès simultané. En utilisant un verrou mutex, nous garantissons qu'un seul goroutine peut accéder et modifier la variable count en même temps, évitant ainsi la concurrence des données.

Enfin, attendez que toutes les goroutines soient exécutées via sync.WaitGroup, puis affichez la valeur de comptage finale.

Grâce au verrouillage mutex, nous obtenons un accès sécurisé simultané au comptage, garantissant la cohérence et l'exactitude de l'opération.

Il convient de noter que les verrous mutex doivent être utilisés avec prudence. Une utilisation excessive de mutex réduira les performances parallèles et introduira facilement des blocages et d'autres problèmes. Lors de l'écriture de programmes simultanés, vous devez minimiser l'accès aux variables partagées et utiliser des primitives de concurrence plus légères telles que des opérations atomiques ou des canaux pour éviter une utilisation excessive des mutex.

Pour résumer, l'utilisation de la fonction sync.Mutex dans Golang peut obtenir un code sécurisé pour la concurrence. En verrouillant les opérations de lecture et d'écriture des ressources partagées, nous garantissons la cohérence et l'exactitude de l'accès aux données entre les différentes goroutines. Cependant, dans les applications réelles, nous devons utiliser les verrous avec précaution en fonction de situations spécifiques afin d'éviter des problèmes tels qu'une dégradation des performances et un 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:
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