Maison > Opération et maintenance > exploitation et maintenance Linux > Comment résoudre le problème de l'accès simultané multi-thread et multi-thread Linux à la même mémoire

Comment résoudre le problème de l'accès simultané multi-thread et multi-thread Linux à la même mémoire

WBOY
Libérer: 2023-05-17 17:26:23
avant
2116 Les gens l'ont consulté

Pourquoi avez-vous besoin du multithread ?

  • Cette capacité des entités parallèles à partager le même espace d'adressage et toutes les données disponibles ne peut pas être exprimée par des verrous multi-processus, car plusieurs processus ont des espaces d'adressage différents

  • Les threads sont plus légers et plus rapides que les processus ;

  • Lorsque de nombreux traitements et calculs d'E/S sont nécessaires, le fait d'avoir plusieurs threads peut améliorer considérablement les performances.

  • Dans les systèmes multi-CPU, le multi-threading est bénéfique. Dans un tel système, la physique peut être véritablement réalisée en plusieurs. -fonctionnement parallèle threadé sur l'ordinateur

Avantages du multi-threading

  • Accélération de la réponse du programme

  • Lorsqu'il n'y a aucune tâche à traiter, le temps du processeur peut être attribué à d'autres tâches ;

  • Les tâches qui prennent beaucoup de temps de traitement peuvent régulièrement céder du temps processeur à d'autres tâches ;

  • Vous pouvez arrêter la tâche à tout moment

  • Vous pouvez définir la priorité de chaque tâche séparément pour l'optimiser ; performances ;

Meilleurs scénarios d'application

  • Les tâches chronophages ou gourmandes en ressources processeur bloquent les opérations de l'interface utilisateur

  • Chaque tâche doit attendre des ressources externes (telles qu'une connexion à distance ou une connexion Internet) ;

    Inconvénients du multi-threading

Attente L'utilisation de ressources partagées ralentira la vitesse d'exécution du programme. Ces ressources partagées sont principalement des ressources exclusives, telles que les imprimantes

  • La gestion des threads nécessite une surcharge CPU supplémentaire ;

    Interblocage des threads, c'est-à-dire plus d'attente longue ou de compétition de ressources,
  • la lecture ou l'écriture simultanée de variables publiques produira souvent des erreurs imprévisibles
  • Idées de vérification
  • Utilisez cinq threads pour la même variable globale (la valeur initiale est 0) La fonction effectue des opérations ++ et chaque thread fonctionne ++1 000 fois. Par conséquent, nos 5 threads devraient ++ 5 000 fois et la valeur finale de la variable globale doit être 5 000.

J'ai effectué différentes tentatives et constaté que la valeur wg était parfois de 5000, parfois de 4997 ou 4998.

La raison est :

Comment résoudre le problème de laccès simultané multi-thread et multi-thread Linux à la même mémoire

Nous utilisons wg++, qui n'est pas une opération atomique. Elle est convertie en instructions. Elle se compose de plusieurs instructions. Les instructions binaires exécutées par l'ordinateur divisent l'opération d'incrémentation des variables en plusieurs étapes. Par exemple, deux threads lisent wg++

mais ++ ne peut pas être terminé en même temps. Lisez d'abord val, puis ++, puis relisez-le. Cette opération n'est pas encore terminée. +, puis relisez-le. Il est possible que deux threads ajoutent wg=1;, mais la valeur finale est 2.

Nous ne pouvons pas seulement considérer le problème au niveau du code, nous devons également considérer l'environnement dans lequel le code s'exécute. En observant les paramètres de notre machine virtuelle, nous avons constaté qu'il y a 4 processeurs, au moins deux processeurs sont en train de traiter. d'autres threads, et il y a un thread Dans le cas de deux processeurs, lorsqu'ils sont accessibles en même temps, la probabilité d'occurrence est inférieure à 5 000, ce qui est relativement élevé, ce qui est également dû à une exécution parallèle.

Après avoir activé un seul processeur, un seul thread est en cours d'exécution et les quatre autres threads ne s'exécutent définitivement pas. Il n'y a aucune situation où deux threads sont exécutés en même temps.

La probabilité d'apparaître inférieure à 5000 est très faible (la raison est qu'après avoir lu la valeur val 1, vous n'avez pas eu le temps de ++ revenir en arrière. A ce moment, la tranche horaire est arrivée, et un switch a s'est produit lors du passage à d'autres threads, la valeur est toujours 1, ajoutez plus, récupération sur site, ajoutez toujours 1, la probabilité que ce scénario se produise est très faible) 1 processeur ne peut pas être parallélisé.

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!

Étiquettes associées:
source:yisu.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal