Maison >développement back-end >Golang >Pourquoi le modèle de mémoire de Go autorise-t-il une sortie inattendue dans les goroutines simultanées ?
Synchronisation incorrecte dans Go Lang
Le modèle de mémoire Go spécifie que dans une seule goroutine, les lectures et écritures doivent se comporter comme si elles s'exécutaient dans l'ordre spécifié par le programme. Cependant, un comportement particulier se produit lors de l'utilisation de plusieurs goroutines, comme en témoigne le code suivant :
var a, b int func f() { a = 1 b = 2 } func g() { print(b) print(a) } func main() { go f() g() }
Selon le document, il est possible que le code imprime d'abord "2" puis "0" au lieu de les "1" et "2" attendus. Pourquoi cela se produit-il ?
Bien qu'elles apparaissent séquentielles dans le code, les affectations à a et b peuvent se produire dans le désordre au sein de la goroutine f. Puisque la goroutine n'utilise pas les variables après l'affectation, le compilateur peut les optimiser en les réorganisant.
Cependant, le manque de synchronisation entre les goroutines f et g signifie que le compilateur n'assure pas la cohérence au moment de l'impression. Par conséquent, la valeur de b peut être observée avant celle de a lorsque les deux affectations se produisent dans la même goroutine.
Pour garantir l'exactitude, la synchronisation entre les goroutines est requise. Au point de synchronisation, le compilateur garantira que les deux affectations sont terminées. Par exemple, si un point de synchronisation est placé avant les appels d'impression, les nouvelles valeurs (2 et 1) seront imprimées correctement, évitant ainsi un comportement incorrect.
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!