Table des matières
Contenu de la question
Solution
Maison développement back-end Golang Le remplacement d'une variable mappée par un nouvel objet mappé est-il thread-safe ?

Le remplacement d'une variable mappée par un nouvel objet mappé est-il thread-safe ?

Feb 10, 2024 pm 04:33 PM
并发访问 键值对

Le remplacement dune variable mappée par un nouvel objet mappé est-il thread-safe ?

Éditeur PHP Apple est là pour répondre à une question courante : « Est-il thread-safe de remplacer une variable de mappage par un nouvel objet de mappage ? » Une variable de mappage est une structure de données courante utilisée pour stocker des paires clé-valeur. Dans un environnement multithread, la sécurité des threads est une considération importante. Bien que l'utilisation d'un nouvel objet de mappage puisse éviter le problème de l'accès simultané, sa compatibilité avec les threads doit encore être évaluée au cas par cas. Ensuite, nous explorerons cette question en profondeur pour aider les lecteurs à mieux comprendre la relation entre la sécurité des threads et les objets mappés.

Contenu de la question

Je ne pense pas qu'il soit thread-safe car l'objet mappé est plus grand que les mots machine et golang ne garantit pas qu'il est thread-safe. Mais lorsque j'exécute le code de démonstration en utilisant go run -race main.go, il ne signale jamais d'erreur. C'est peut-être la raison pour laquelle threadsanitizer s'appuie sur des contrôles d'exécution et des opérations d'affectation pour avoir du mal à satisfaire des conditions non sécurisées pour les threads.

Voici l'exemple de code :

package main

import (
    "fmt"
)

var m = make(map[int]bool)

func Read() {
    for {
        for k := range m {
            fmt.Println(k)
        }
    }
}

func Replace() {
    for {
        newM := make(map[int]bool, 10)
        for i := 0; i < 10; i++ {
            newM[i] = false
        }
        m = newM
    }
}

func main() {
    c := make(chan struct{})

    go Read()
    go Replace()

    <-c
}

Copier après la connexion

Alors, comment modifier le code pour déclencher des erreurs de concurrence ? Ou peut-être que je me trompe et que le code est thread-safe ?

Solution

Voici quelques points à noter :

for k := range m {
Copier après la connexion

Les expressions Range sont évaluées une fois au début de la boucle for. Cette opération lira donc m 一次(注意,这意味着如果循环中的代码重新分配 m ,则循环将继续迭代原始 m ,但是如果添加新元素或从 m 中删除元素,这些将被检测到循环),循环本身会调用 fmt.println , ce qui consommera la majeure partie du temps d'exécution dans cette goroutine. Si vous souhaitez rattraper le jeu, supprimez-le.

Deuxièmement, vous n'avez pas réellement besoin d'initialiser la deuxième carte.

Lorsque vous effectuez ces opérations et exécutez le détecteur de course, il peut détecter des courses de données. En ce qui me concerne, c'est le cas.

Le détecteur de conflits se plaindra d'un conflit lorsqu'il le détectera. Donc, s’il signale une correspondance, alors il y a une correspondance. Si ce n’est pas signalé, cela ne veut pas dire qu’il n’y a pas de contestation.

Sur ma plateforme, la variable map elle-même a en fait la même taille qu'un mot machine : c'est juste un pointeur vers la structure mappée. Par conséquent, les écritures sur les variables mappées sont effectivement atomiques, c'est-à-dire que vous ne verrez pas de mappages partiellement alloués sur cette plateforme. Cependant, cela n'empêche pas les conflits puisqu'il n'y a aucune garantie quand d'autres goroutines verront cette mémoire écrire.

En bref, c’est une compétition. Cela n'est pas dû à la taille de la variable map. Pour résoudre ce problème, utilisez un mutex.

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La différence entre les crochets et les accolades dans Vue La différence entre les crochets et les accolades dans Vue May 02, 2024 pm 10:06 PM

Les crochets sont utilisés pour accéder aux éléments du tableau, à la liaison de propriétés dynamiques et aux propriétés calculées, tandis que les accolades sont utilisées pour créer des littéraux d'objet, des expressions de modèle et des méthodes d'appel. L'utilisation correcte de ces symboles dans Vue.js est cruciale pour un traitement efficace des données et la création d'applications interactives.

Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? Comment garantir la sécurité des threads des variables volatiles dans les fonctions Java ? May 04, 2024 am 10:15 AM

Méthodes pour garantir la sécurité des threads des variables volatiles en Java : Visibilité : assurez-vous que les modifications apportées aux variables volatiles par un thread sont immédiatement visibles par les autres threads. Atomicité : assurez-vous que certaines opérations sur des variables volatiles (telles que les échanges d'écriture, de lecture et de comparaison) sont indivisibles et ne seront pas interrompues par d'autres threads.

À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? À quels pièges devons-nous prêter attention lors de la conception de systèmes distribués avec la technologie Golang ? May 07, 2024 pm 12:39 PM

Pièges du langage Go lors de la conception de systèmes distribués Go est un langage populaire utilisé pour développer des systèmes distribués. Cependant, il existe certains pièges à prendre en compte lors de l'utilisation de Go qui peuvent nuire à la robustesse, aux performances et à l'exactitude de votre système. Cet article explorera quelques pièges courants et fournira des exemples pratiques sur la façon de les éviter. 1. Surutilisation de la concurrence Go est un langage de concurrence qui encourage les développeurs à utiliser des goroutines pour augmenter le parallélisme. Cependant, une utilisation excessive de la concurrence peut entraîner une instabilité du système, car trop de goroutines se disputent les ressources et entraînent une surcharge de changement de contexte. Cas pratique : une utilisation excessive de la concurrence entraîne des retards de réponse des services et une concurrence entre les ressources, qui se manifestent par une utilisation élevée du processeur et une surcharge importante de garbage collection.

Comment utiliser la carte dans vue Comment utiliser la carte dans vue May 02, 2024 pm 09:54 PM

Les cartes sont utilisées dans Vue.js pour stocker des paires clé-valeur, où les clés peuvent être de n'importe quel type de données. Les méthodes d'utilisation incluent : la création d'une carte, l'ajout et l'accès à des données, la suppression de données et le parcours de données. La carte est réactive et met automatiquement à jour la vue lorsqu'elle change.

Structures de données et algorithmes Java : explication détaillée Structures de données et algorithmes Java : explication détaillée May 08, 2024 pm 10:12 PM

Les structures de données et les algorithmes sont à la base du développement Java. Cet article explore en profondeur les structures de données clés (telles que les tableaux, les listes chaînées, les arbres, etc.) et les algorithmes (tels que le tri, la recherche, les algorithmes graphiques, etc.) en Java. Ces structures sont illustrées par des exemples pratiques, notamment l'utilisation de tableaux pour stocker les scores, de listes chaînées pour gérer les listes de courses, de piles pour implémenter la récursion, de files d'attente pour synchroniser les threads, ainsi que d'arbres et de tables de hachage pour une recherche et une authentification rapides. Comprendre ces concepts vous permet d'écrire du code Java efficace et maintenable.

Un guide pour les tests unitaires des fonctions simultanées Go Un guide pour les tests unitaires des fonctions simultanées Go May 03, 2024 am 10:54 AM

Les tests unitaires des fonctions simultanées sont essentiels car cela permet de garantir leur comportement correct dans un environnement simultané. Des principes fondamentaux tels que l'exclusion mutuelle, la synchronisation et l'isolement doivent être pris en compte lors du test de fonctions concurrentes. Les fonctions simultanées peuvent être testées unitairement en simulant, en testant les conditions de concurrence et en vérifiant les résultats.

Comment résoudre le problème des serveurs occupés pour Deepseek Comment résoudre le problème des serveurs occupés pour Deepseek Mar 12, 2025 pm 01:39 PM

Deepseek: Comment gérer l'IA populaire qui est encombré de serveurs? En tant qu'IA chaude en 2025, Deepseek est gratuit et open source et a une performance comparable à la version officielle d'Openaio1, qui montre sa popularité. Cependant, une concurrence élevée apporte également le problème de l'agitation du serveur. Cet article analysera les raisons et fournira des stratégies d'adaptation. Entrée de la version Web Deepseek: https://www.deepseek.com/deepseek serveur Raison: Accès simultané: des fonctionnalités gratuites et puissantes de Deepseek attirent un grand nombre d'utilisateurs à utiliser en même temps, ce qui entraîne une charge de serveur excessive. Cyber ​​Attack: Il est rapporté que Deepseek a un impact sur l'industrie financière américaine.

Comment gérer les conditions de concurrence et les conditions de concurrence dans la programmation simultanée Java ? Comment gérer les conditions de concurrence et les conditions de concurrence dans la programmation simultanée Java ? May 08, 2024 pm 04:33 PM

Dans la programmation simultanée Java, les conditions de concurrence et les conditions de concurrence peuvent conduire à un comportement imprévisible. Une condition de concurrence critique se produit lorsque plusieurs threads accèdent aux données partagées en même temps, ce qui entraîne des états de données incohérents, qui peuvent être résolus à l'aide de verrous pour la synchronisation. Une condition de concurrence critique se produit lorsque plusieurs threads exécutent la même partie critique du code en même temps, ce qui entraîne des résultats inattendus. Les opérations atomiques peuvent être garanties en utilisant des variables atomiques ou des verrous.

See all articles