2010-12-28 5 views
14

Ich möchte Threads durch eine einfache ID bei der Protokollierung identifizieren, so dass es einfach ist, die Ausführung eines einzelnen Threads zu verfolgen. Mit Windows mit der API GetCurrentThreadId() kann erreichen, was ich will. In boost::thread gibt es eine Methode get_id(), aber das ist kein ganzzahliger Wert wie eine ganze Zahl. Dieses Objekt hat ein thread_data-Mitglied, das eine ID enthält, die zu sein scheint, was ich will, aber das Datenelement ist privat, so dass nicht darauf zugegriffen werden kann.Wie die Thread-ID aus einem boost :: thread abrufen?

Wie können Sie die Thread-ID für Anzeige- oder Identifikationszwecke aufrufen?

Antwort

9

-Boost eine operator<<(std::ostream&, const boost::thread::id&) Überlastung umfasst, die verwendet werden können, eine Thread-ID, um einen Strom zu schreiben (tatsächlich ist die Überlast eine Schablone und wird mit jeder Spezialisierung des std::basic_ostream arbeitet, nicht nur std::ostream).

Das Ergebnis des Druckens der ID ist wahrscheinlich plattformspezifisch, da unterschiedliche Plattformen unterschiedliche interne Repräsentationen für Thread-IDs verwenden können.

+0

also als Parameter zu einer Funktion würde ich die boost :: thread :: id mit einem Output-Stream-Operator verwendet werden? Dies hört sich nahe an, außer wenn der Wert ohne Streams oder Stream-Operatoren verwendbar sein soll. – AJG85

+0

mit boost :: this_thread :: get_id() aus der threads worker-funktion tatsächlich mit der sprintf_s stil formatierung ohne erforderliche parameter gearbeitet. – AJG85

8

Sie müssen die Elementfunktion boost::thread::native_handle() verwenden. Es gibt einen Typ native_handle_type zurück, bei dem es sich um einen implementierungsdefinierten Alias ​​für eine systemeigene Thread-ID handelt, der dann mit nativen Thread-API-Funktionen verwendet werden kann.

+0

Während nützlich, alles zu wissen, was ich brauche, ist die Thread-ID. Der Hauptgrund für die Verwendung von boost :: thread ist, in meinem Fall OS-spezifische Aufrufe zu vermeiden. – AJG85

+3

@ AJG85: ... und 'nativehandle()' wird Ihnen mit * genau * solch einem eindeutigen Bezeichner versehen, was ist das Problem? Sie müssen es für nichts anderes verwenden; das war nur eine Erklärung dessen, was der Wert darstellt; es ist tatsächlich * genau *, was Sie von 'GetCurrentThreadId()' bekommen würden. Wichtig ist, dass dieser Bezeichner mit dem im Fenster * threads * des Debuggers angezeigt wird. Wenn Sie also dessen Wert kennen, können Sie das Multithread-Debugging unterstützen. – Clifford

+0

Guter Punkt. Nur weil es für native Anrufe verwendet werden kann, bedeutet das nicht, dass es das einzige ist, für das es ist. Ich glaube auch, dass es dem Handle entspricht, das Sie von GetCurrentThread() erhalten würden, im Gegensatz zu der Ganzzahl-ID, die von GetCurrentThreadId() zurückgegeben wird. – AJG85

39

zu spät, aber für die Nutzer nach einer Antwort suchen, kann boost die Thread-ID konsultieren, wie Sie gesagt haben, einfach die folgende Methode aufrufen:

boost::this_thread::get_id() 

Diese Methode gibt eine interne ID Art von Boost, dass ist nicht numerisch, wie Sie möchten. Sie können diese Zahl jedoch leicht in eine vorzeichenlose Länge umwandeln, indem Sie berücksichtigen, dass die ID eine hexadezimale Darstellung hat. Diese kleine Funktion wird de Job tun:

#include <boost/lexical_cast.hpp> 
#include <boost/thread.hpp> 

unsigned long getThreadId(){ 
    std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id()); 
    unsigned long threadNumber = 0; 
    sscanf(threadId.c_str(), "%lx", &threadNumber); 
    return threadNumber; 
} 

void drawThreadId(){ 
    std::cout << getThreadId() << std::endl; 
    boost::this_thread::sleep(boost::posix_time::milliseconds(500)); 
} 

int main() { 
    for(int i=0; i<10; i++){ 
     boost::thread thread = boost::thread(drawThreadId); 
    } 
    return 0; 
} 

Das wird so etwas wie dies zurück:

4491075584 
4491612160 
4492148736 
4492685312 
4493221888 
4493758464 
4494295040 
4494831616 
4495368192 
4495904768 

Sie nicht Link mit boost_thread und boost_system vergessen.

Hoffe, das hilft!

+0

+1 Danke, das ist, was ich gesucht habe! – Avio

+0

Wie hole ich ID aus Thread-Objekt? ('boost :: thread mythread') –

Verwandte Themen