Maison >développement back-end >Golang >Les lectures et écritures simultanées sur les structures Go peuvent-elles fonctionner sans verrous, et pourquoi est-ce risqué ?
Lecture et écriture simultanées de Golang Struct sans verrouillage : pourquoi possible mais risqué
Il a été observé que les opérations de lecture et d'écriture simultanées sur une structure in Go peut fonctionner sans verrou et toujours fonctionner sans problèmes apparents. Ceci est illustré par la fonction concurrentStruct() fournie, qui implique deux goroutines modifiant continuellement le champ d'une structure partagée. Malgré les avertissements indiquant des courses de données potentielles, le code s'exécute avec succès.
Ce comportement découle du modèle de mémoire de Go et du fait que les structures sont passées par référence, ce qui signifie que toutes les goroutines travaillent sur la même instance de la structure. Tant que les accès aux champs individuels sont atomiques, il n'y a aucune garantie de corruption des données.
Cependant, un tel comportement est fortement déconseillé et peut conduire à des résultats imprévisibles. L'accès simultané non synchronisé à n'importe quelle variable provenant de plusieurs goroutines, dont au moins une est une écriture, est considéré comme un comportement non défini dans Go. Cela pourrait entraîner des résultats incorrects, des plantages ou d'autres conséquences inattendues.
Contraste avec l'accès protégé
En revanche, la fonction concurrentStructWithMuLock() utilise un mutex en lecture-écriture pour synchroniser l'accès à la structure. Cela élimine la possibilité de courses de données et garantit un comportement cohérent, comme en témoigne l'absence d'avertissements de condition de concurrence.
Problèmes de concurrence de cartes
La fonction concurrentMap() met en évidence un problème différent lié à la concurrence. Go 1.6 a introduit une détection légère de l'utilisation abusive simultanée des cartes. Si plusieurs goroutines tentent de lire ou d'écrire simultanément sur la même carte sans synchronisation appropriée, le moteur d'exécution plante intentionnellement le programme pour empêcher un comportement indéfini. Ce comportement est déclenché par le détecteur de course et souligne l'importance d'utiliser des mécanismes de synchronisation pour les opérations cartographiques simultanées.
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!