2012-07-13 20 views
7

ist thre irgendein reliable Weg in C++ 11 zu erkennen, ob der aktuelle Thread der Hauptthread ist? Oder würde ich manuell die Haupt-Threads Thread-ID mit std::this_thread::get_id() speichern und haben dann eine Routine wie folgt aus:Std :: Thread erkennen Hauptthread

bool isMainThread() 
{ 
    return theMainThreadIdISavedOnProgramStart == std::this_thread::get_id(); 
} 

Gibt es einen gemeinsamen Weg, dies zu tun? Würde die obige Lösung funktionieren?

Danke

+2

Sie könnten auch eine Markierung im Thread-lokalen Speicher setzen, aber ich bin nicht sicher, ob TLS zu diesem Zeitpunkt allgemein verfügbar ist. – dasblinkenlight

Antwort

8

Was meinst du mit Haupt-Thread? Wenn du meinst, der Thread, der main() ausführt, dann gibt es keine Möglichkeit zu wissen, ob ein Thread ein Haupt-Thread ist oder nicht. Sie müssen seine ID speichern und später können Sie die gespeicherte ID verwenden, um zu wissen, ob ein aktueller Thread ein Haupt-Thread ist oder nicht, indem Sie seine ID mit der gespeicherten ID vergleichen (wie Sie in Ihrer Frage erraten haben).

Um es ein wenig mehr zu erklären, haben Threads keine Hierarchie, es gibt keinen übergeordneten Thread, keinen untergeordneten Thread, auch wenn ein Thread die anderen Threads erstellt. Das Betriebssystem merkt sich nicht, welche Threads von welchem ​​Thread erstellt wurden. Daher sind alle Threads für das Betriebssystem und für Ihr Programm identisch. Sie können also keinen main-Thread ableiten, indem Sie erkennen, ob der aktuelle Thread das übergeordnete Element aller anderen Threads in Ihrer Anwendung ist.

+1

danke für die Erklärung! Ich habe tatsächlich den Thread ausgeführt, der main() ausführt! Ich werde die ID dann manuell speichern! Vielen Dank! – moka

+3

Sehr korrekte Antwort. Als Nebenbemerkung und abhängig von der Plattform gibt es auf POSIX-Plattformen, auf denen FreeBSD, OpenBSD, Mac OS X oder iOS läuft, eine Funktion in pthread.h - int pthread_main_np (void); Dies gibt ungleich Null zurück, wenn der Thread der Hauptthread ist. Wenn Sie einen Thread mit std :: thread erzeugt haben, funktioniert diese zugrunde liegende Funktion korrekt. Beachten Sie, dass "np" am Ende der Funktion "nicht tragbar" bedeutet, also hat Nawaz immer noch die beste plattformunabhängige Antwort. – NSDestr0yer

Verwandte Themen