Maison  >  Article  >  développement back-end  >  Comment utiliser ThreadSanitizer pour déboguer les erreurs multi-thread C++ ?

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

WBOY
WBOYoriginal
2024-06-02 19:43:09341parcourir

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 ...
  1. Ajoutez les indicateurs suivants à la commande de lien :
-ltsan

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();
  }
}

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

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!

Déclaration:
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