Maison  >  Article  >  développement back-end  >  Quels sont les mécanismes de synchronisation dans la programmation simultanée des fonctions Golang ?

Quels sont les mécanismes de synchronisation dans la programmation simultanée des fonctions Golang ?

WBOY
WBOYoriginal
2024-04-17 17:30:01380parcourir

Dans la programmation simultanée de Go, le mécanisme de synchronisation est la clé pour garantir l'intégrité des données partagées. Il fournit une variété de types intégrés, notamment : Mutex (Mutex) : fournit un accès exclusif aux données partagées ; verrouillage en lecture-écriture : permet à plusieurs goroutines de lire en même temps mais une seule goroutine peut écrire des données. pour Coordonner l'attente et le réveil parmi les goroutines.

Quels sont les mécanismes de synchronisation dans la programmation simultanée des fonctions Golang ?

Mécanisme de synchronisation dans la programmation simultanée de la fonction Go

Dans la programmation simultanée de Go, lorsque plusieurs goroutines (threads légers dans Golang) exploitent des données partagées en même temps, un mécanisme de synchronisation est nécessaire pour garantir l'intégrité des données. . Go fournit une variété de types de synchronisation intégrés pour coordonner l'accès aux goroutines.

1. Mutex

Mutex (verrouillage mutex) est le mécanisme de synchronisation le plus basique, qui fournit un accès exclusif aux données partagées. Une seule goroutine à la fois peut contenir le mutex, garantissant ainsi les opérations atomiques sur les données partagées.

import (
    "fmt"
    "sync"
)

func main() {
    var count int
    var mu sync.Mutex

    for i := 0; i < 1000; i++ {
        go func(i int) {
            mu.Lock()
            count++
            mu.Unlock()
        }(i)
    }

    fmt.Println("Count:", count) // 输出:1000
}

2. Verrouillage en lecture-écriture

Le verrouillage en lecture-écriture est un mécanisme de synchronisation avancé qui permet à plusieurs goroutines de lire des données partagées en même temps, mais une seule goroutine peut écrire des données partagées à la fois. Cela améliore les performances de concurrence tout en garantissant l’intégrité des données.

import (
    "fmt"
    "sync"
)

func main() {
    var count int
    var rw sync.RWMutex

    for i := 0; i < 1000; i++ {
        go func(i int) {
            rw.RLock()
            fmt.Println("Reading:", count)
            rw.RUnlock()
        }(i)

        go func(i int) {
            rw.Lock()
            count++
            fmt.Println("Writing:", count)
            rw.Unlock()
        }(i)
    }
}

3. Variable de condition

La variable de condition (cond) est utilisée pour coordonner l'attente et le réveil entre les goroutines. Lorsqu'une goroutine remplit une condition spécifique, elle peut réveiller les goroutines en attente de cette condition.

import (
    "fmt"
    "sync"
)

func main() {
    var cond sync.Cond
    var signal bool

    sync.Mutex.Lock(&l)
    for !signal {
        cond.Wait(&l)
    }
    // ... 执行需要信号的代码 ...
    sync.Mutex.Unlock(&l)
}

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