Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verwende ich ThreadSanitizer zum Debuggen von C++-Multithreading-Fehlern?

Wie verwende ich ThreadSanitizer zum Debuggen von C++-Multithreading-Fehlern?

WBOY
WBOYOriginal
2024-06-02 19:43:09341Durchsuche

ThreadSanitizer (TSan) erkennt Multithreading-Fehler während der Ausführung von C++-Code wie folgt: Kompilieren Sie den Code: clang++ -fsanitize=thread ...Link-Flag hinzufügen: -ltsanTSan erkennt Race Conditions und Data Races und gibt Fehlermeldungen aus. Wenn im Code ein Datenwettlauffehler vorliegt, gibt TSan eine Meldung ähnlich der „Datenwettlauf“ aus.

Wie verwende ich ThreadSanitizer zum Debuggen von C++-Multithreading-Fehlern?

So verwenden Sie ThreadSanitizer zum Debuggen von C++-Multithreading-Fehlern

Einführung

ThreadSanitizer (TSan) ist ein dynamisches Analysetool zur Erkennung von Multithreading-Fehlern in C++-Code. Im Gegensatz zu anderen Debugging-Tools kann es diese Fehler während der tatsächlichen Laufzeit erkennen und nicht nur bei der statischen Analyse.

Installieren Sie TSan

Um TSan in Ihrem Projekt zu verwenden, befolgen Sie diese Schritte:

  1. Kompilieren Sie Ihren Code mit:
clang++ -fsanitize=thread ...
  1. Fügen Sie die folgenden Flags zum Link-Befehl hinzu:
.
-ltsan

Verwendung

TSan fügt automatisch Prüfcode ein, um Race Conditions und Data Races zu erkennen. Wenn ein Fehler festgestellt wird, wird eine Meldung ausgegeben und das Programm beendet.

Hier sind einige häufige TSan-Fehlermeldungen:

  • „Data Race“: Zwei Threads schreiben gleichzeitig in eine gemeinsam genutzte Variable.
  • "Lock-Order-Inversion": Zwei Threads erwerben/freigeben Sperren in der falschen Reihenfolge.
  • „Deadlock“: Zwei Threads warten auf die von der anderen Partei freigegebene Sperre.

Echter Fall

Betrachten Sie den folgenden Code, der einen Datenwettlauffehler aufweist:

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

Kompilieren Sie diesen Code und führen Sie ihn aus. TSan erkennt den Datenwettlauffehler und gibt eine Meldung ähnlich der folgenden aus:

==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

Fazit

ThreadSanitizer ist ein leistungsstarkes Tool zum Debuggen von C++-Multithreading-Fehlern. Es erkennt diese Fehler während der tatsächlichen Ausführung, was den Entwicklungsprozess beschleunigt und die Robustheit des Codes gewährleistet.

Das obige ist der detaillierte Inhalt vonWie verwende ich ThreadSanitizer zum Debuggen von C++-Multithreading-Fehlern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn