• [^] # Re: Go ou Rust côté backend, système ou embarqué

    Posté par (site web personnel) . En réponse au journal La ronde (boucle?) des langages. Évalué à 10.

    Pas du tout, Go ne te garantit pas ça, sauf à ne pas utiliser les pointeurs (et comme les slices et maps utilisent les pointeurs, c'est particulièrement rude). Voici un exemple sans variable globale, avec uniquement de la communication entre goroutines via un channel : https://play.golang.org/p/riJqqpTHso9.

    On fait le même traitement sur chaque entrée d'une map, en parallèle sur 3 goroutines. Si tout devait bien se passer, on devrait avoir la même valeur pour toutes les entrées de la map. Or, je viens de lancer et ça m'affiche : map[%!s(int=0):2 %!s(int=4):1 %!s(int=5):1 %!s(int=6):3 %!s(int=8):2 %!s(int=1):2 %!s(int=2):2 %!s(int=3):2 %!s(int=7):3 %!s(int=9):2] (des valeurs différentes).

    L'exemple est un peu tiré par les cheveux, mais sur Cozy Cloud, on a déjà eu des problèmes réels en production d'accès concurrents entre plusieurs goroutines sur des structs qui sont passées d'une goroutine à d'autres via des channels.

    Par contre, ce que tu décris est vrai en Erlang, qui a des espaces mémoires totalement séparés entre les différents processus légers et fais des copies de données.