Dans le code fourni, deux fonctions sont introduites : concurrentStruct() et concurrentStructWithMuLock (). Les deux fonctions lisent et écrivent simultanément une structure, mais la première le fait sans verrous et génère des avertissements de course. À l’inverse, ce dernier utilise un mutex en lecture-écriture pour synchroniser l’accès, ce qui n’entraîne aucun avertissement de course aux données.
Comme l’indiquent les messages d’erreur, une course aux données se produit lorsque :
Dans concurrentStruct(), cette situation se produit car le champ clé de la structure de métadonnées est accédé et modifié par plusieurs goroutines sans aucune synchronisation.
Bien que concurrentStruct() n'utilise pas de verrous, l'utilisation de goroutines anonymes s'exécutant indéfiniment mène aux conditions de course potentielles. Ces goroutines lisent, modifient et écrivent continuellement le champ clé sans tenir compte des actions des autres goroutines.
Contrairement à concurrentStruct(), concurrentStructWithMuLock() utilise un read -write mutex pour synchroniser l'accès au champ clé. Cela garantit une exclusion mutuelle, empêchant plusieurs goroutines de modifier simultanément le champ. Par conséquent, aucune condition de concurrence ne se produit et la fonction s'exécute sans avertissement.
La fonction concurrentMap() démontre un type différent de condition de concurrence impliquant une carte Go. . Bien que les cartes soient thread-safe dans Go, l'accès simultané à la carte pour les lectures et les écritures sans synchronisation appropriée peut entraîner des erreurs fatales. Le moteur d'exécution de Go comprend un détecteur léger de course aux données, qui fait planter le programme lorsqu'il détecte un tel accès non synchronisé aux cartes afin de se prémunir contre un comportement non défini.
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!