Maison > développement back-end > Golang > Introduction détaillée à l'utilisation de Golang Cond

Introduction détaillée à l'utilisation de Golang Cond

PHPz
Libérer: 2023-04-05 10:54:07
original
1535 Les gens l'ont consulté

Golang est un langage de programmation efficace, concis et simultané. Dans Golang, cond est un outil utilisé pour contrôler l'exécution simultanée de programmes. Cet article présentera l'utilisation de cond en détail.

1. Introduction de base à cond

Cond signifie variable de condition. Il s'agit d'un mécanisme de contrôle de concurrence important dans Golang. La fonction principale de cond est de permettre à plusieurs goroutines d'attendre que l'état d'une variable partagée change en même temps et de notifier la goroutine en attente d'effectuer des opérations ultérieures lorsque l'état de la variable partagée change. Contrairement à mutex, cond ne peut pas être utilisé pour protéger l'accès simultané aux variables partagées, il doit s'appuyer sur mutex pour être exécuté. Son utilisation de base est très simple et se divise en trois étapes :

  1. Lorsqu'une goroutine doit attendre un changement dans l'état d'une variable partagée, appelez la fonction cond.Wait() pour entrer dans l'état d'attente ; d'autres goroutines changent l'état d'une variable partagée, appelez La fonction cond.Signal() ou cond.Broadcast() réveille la goroutine en attente
  2. Après avoir réveillé la goroutine en attente, vous devez réacquérir le verrou mutex de la variable partagée ; pour poursuivre l'exécution.
  3. 2. Utilisation de cond

Dans les applications pratiques, cond est généralement utilisé en combinaison avec mutex pour obtenir un accès sécurisé simultané aux variables partagées. Ce qui suit est un exemple de programme simple qui montre comment utiliser cond pour contrôler l'exécution simultanée de plusieurs goroutines :

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mutex sync.Mutex
    cond  *sync.Cond = sync.NewCond(&mutex)
)

func worker() {
    for {
        mutex.Lock()
        for count < 10 {
            cond.Wait()
        }
        count--
        fmt.Printf("worker: %d\n", count)
        mutex.Unlock()
        cond.Signal()
    }
}

func main() {
    for i := 0; i < 10; i++ {
        go worker()
    }
    for {
        mutex.Lock()
        if count >= 10 {
            mutex.Unlock()
            break
        }
        count++
        fmt.Printf("main: %d\n", count)
        mutex.Unlock()
        cond.Signal()
    }
}
Copier après la connexion

Dans cet exemple de code, count représente une variable partagée avec une valeur initiale de 0, indiquant le nombre de tâches qui peuvent être exécuté. Lorsque la valeur du nombre de variables partagées est inférieure à 10, toutes les goroutines de travail attendront que la valeur du nombre de variables partagées soit augmentée à plus de 10 avant d'être réveillées.

Dans la goroutine principale, augmentez la valeur du nombre de variables partagées en appelant la fonction cond.Signal() dans une boucle et informez les goroutines de travail en attente de continuer l'exécution. Lorsque la valeur du nombre de variables partagées est augmentée à 10, la goroutine principale cesse d'appeler la fonction cond.Signal() et toutes les goroutines de travail quittent l'exécution.

Il convient de noter que lorsqu'une goroutine attend cond, elle libère automatiquement le verrou mutex afin que d'autres goroutines puissent accéder aux variables partagées. Une fois réveillée, la goroutine doit réacquérir le verrou mutex pour continuer l'exécution.

3. Notes sur cond

Bien que l'utilisation de cond soit un mécanisme de synchronisation efficace par rapport au mécanisme traditionnel de variable de condition, il y a également des points auxquels il faut prêter attention lors de son utilisation :

la fonction cond.Wait() doit toujours Utilisé dans une boucle for pour éviter les faux réveils. Plus précisément, le jugement des conditions d'attente doit être ajouté au réveil
  1. Avant d'utiliser cond, le mutex doit être initialisé
  2. Avant d'utiliser cond.Signal() ou After cond ; .Broadcast(), la goroutine réveillée doit réacquérir le verrou mutex ;
  3. cond ne peut pas non plus garantir la sécurité des threads, donc lorsque plusieurs goroutines accèdent à des variables partagées, le mutex doit être utilisé pour le contrôle de sécurité de la concurrence.
  4. 4. Conclusion

Le mécanisme de contrôle de concurrence de Golang est très puissant grâce aux deux mécanismes de contrôle de concurrence de base que sont mutex et cond, de puissants programmes simultanés peuvent être réalisés. Lors de l'utilisation de cond, vous devez faire attention à ses méthodes et précautions d'utilisation de base, et comprendre le principe de fonctionnement du mécanisme cond afin de mieux jouer son rôle.

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!

source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal