Maison  >  Article  >  développement back-end  >  Pourquoi l'exécution simultanée de Go peut-elle conduire à des valeurs de variables inattendues ?

Pourquoi l'exécution simultanée de Go peut-elle conduire à des valeurs de variables inattendues ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-26 22:40:14512parcourir

Why Can Go's Concurrent Execution Lead to Unexpected Variable Values?

Synchronisation incorrecte dans GoLang

Le document du modèle de mémoire GoLang indique que le code suivant peut entraîner l'impression de g 2 suivi de 0 :

var a, b int

func f() {
    a = 1
    b = 2
}

func g() {
    print(b)
    print(a)
}

func main() {
    go f()
    g()
}

Cause d'une synchronisation incorrecte

Ce comportement découle de la nature asynchrone des routines Go. Avant toute exécution de fonction, les variables a et b sont initialisées à leurs valeurs nulles respectives (0). La fonction f() modifie ces variables et la fonction g() imprime ensuite leurs valeurs.

Au sein d'une goroutine, la spécification du langage garantit que les lectures et les écritures se produisent dans l'ordre spécifié par le programme. Cependant, une réorganisation des opérations peut avoir lieu sans affecter le comportement de la goroutine, ce qui est le cas ici.

Dans la goroutine f(), le compilateur peut optimiser en réorganisant les affectations de b et a. Étant donné que la goroutine n'utilise pas ces variables après l'affectation, la réorganisation n'affecte pas son comportement.

Considérations sur la synchronisation

La synchronisation entre les goroutines, en revanche, nécessite de la cohérence. Aux points de synchronisation, le compilateur garantit que toutes les affectations ont été terminées, garantissant que a et b ont leurs valeurs attribuées au moment où la goroutine g() les lit. Cela garantit une impression correcte des valeurs modifiées (2 et 1).

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