Maison > développement back-end > C++ > le corps du texte

Comment utiliser ThreadSanitizer pour déboguer les erreurs multi-thread C++ ?

WBOY
Libérer: 2024-06-02 19:43:09
original
347 Les gens l'ont consulté

ThreadSanitizer (TSan) détecte les erreurs multithread pendant l'exécution du code C++, comme suit : Compilez le code : clang++ -fsanitize=thread ...Ajoutez un indicateur de lien : -ltsanTSan détectera les conditions de concurrence critique et les courses de données, et imprimera des messages d'erreur. S'il y a une erreur de course aux données dans le code, TSan imprimera un message similaire à « course aux données ».

Comment utiliser ThreadSanitizer pour déboguer les erreurs multi-thread C++ ?

Comment utiliser ThreadSanitizer pour déboguer les erreurs multi-threading C++

Introduction

ThreadSanitizer (TSan) est un outil d'analyse dynamique utilisé pour détecter les erreurs multi-threading dans le code C++. Contrairement à d'autres outils de débogage, il peut détecter ces erreurs pendant l'exécution réelle, et pas seulement lors d'une analyse statique.

Installez Tsan

Pour utiliser Tsan dans votre projet, suivez ces étapes :

  1. Compilez votre code en utilisant :
clang++ -fsanitize=thread ...
Copier après la connexion
  1. Ajoutez les indicateurs suivants à la commande de lien :
-ltsan
Copier après la connexion

Usage

TSan insère automatiquement un code de vérification pour détecter les conditions de concurrence et les courses de données. S'il détecte une erreur, il imprime un message et quitte le programme.

Voici quelques messages d'erreur TSan courants :

  • "course aux données" : deux threads écrivent dans une variable partagée en même temps.
  • "lock-order-inversion" : Deux threads acquièrent/libèrent les verrous dans le mauvais ordre.
  • "deadlock" : Deux threads attendent le verrou libéré par l'autre partie.

Cas réel

Considérez le code suivant, qui contient une erreur de course aux données :

#include <thread>
#include <vector>

std::vector<int> v;

void thread_function(int num) {
  std::this_thread::sleep_for(std::chrono::milliseconds(100));
  v.push_back(num);
}

int main() {
  std::vector<std::thread> threads;
  for (int i = 0; i < 10; i++) {
    threads.push_back(std::thread(thread_function, i));
  }
  for (auto& t : threads) {
    t.join();
  }
}
Copier après la connexion

Compilez et exécutez ce code, TSan détectera l'erreur de course aux données et imprimera un message similaire au suivant :

==3677061== ThreadSanitizer: data race on write to size 4 at 0x7ffc48162990 in thread T1
...
==3677061== ThreadSanitizer: data race on write to size 4 at 0x7ffc481629d0 in thread T3
Copier après la connexion

Conclusion

ThreadSanitizer est un outil puissant pour déboguer les erreurs multi-thread C++. Il détecte ces erreurs lors de son exécution, accélérant ainsi le processus de développement et garantissant la robustesse du code.

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:
c++
source:php.cn
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