Wo verwende ich _endthreadex - windows API

8

Ich bin ein Anfänger in der Windows-API, und vor kurzem habe ich gelernt, dass ich nicht CreateThread und TerminateThread verwenden sollte. Ich bin zu _beginthreadex gewechselt, bin mir aber nicht sicher, wie ich use _endthreadex umsetzen soll?

Zum Beispiel , hier ist eine grundlegende Funktion, mit der ich getestet habe:

%Vor%

Ist meine Platzierung von _endthreadex korrekt? Ich habe es vor der Rückkehr 0, die mir einfach seltsam erscheint? Ich lese in den msdn-Seiten über _endthreadex , dass es automatisch aufgerufen wird, wenn eine Funktion endet, aber Sie sollten es für bessere Speicherbereinigung aufrufen, und deshalb habe ich versucht, es einzufügen. Es scheint einfach nicht richtig, tut mir leid wenn Das ist eine schlechte Frage. Ich möchte nur sicherstellen, dass ich alles nach besten Kräften mache.

    
sand_storm_of_code.txt 13.01.2013, 03:39
quelle

3 Antworten

9

Sie müssen tatsächlich _endthreadex() überhaupt nicht aufrufen. Es wird automatisch aufgerufen, nachdem Ihre Thread-Funktion trotzdem zurückkehrt.

    
Jeremy Friesner 13.01.2013, 03:48
quelle
3

Die Antwort ist bereits in einer kurzen Version gegeben, und wenn Sie mehr wissen möchten - die Rückkehr von Ihrer Funktion wird tatsächlich als Argument in _endthreadex call verwendet werden. Hier ist was Runtime tut, wenn Sie einen Thread starten. Der Thread wird tatsächlich mit einem Startpunkt irgendwo in CRT gestartet, wo intern _callthreadstartex tut:

%Vor%

Das heißt, sobald du zurückkommst, wird _endthreadex sofort für dich aufgerufen und es wird den Thread verlassen.

Können Sie es explizit verwenden? Ja, das kannst du, und dein Code ist auch gut, weil es egal ist, ob du es selbst nennst oder es für dich aufgerufen wird, sofern unterwegs keine Lecks auftreten (wie insbesondere noch nicht Destruktoren genannt) lokale Variablen).

Da es sowieso für Sie aufgerufen wird und die Rückkehr von der Funktion sicherer ist, um lokale Ressourcen zu befreien, gibt es keinen Nutzen, Vorteil und Sinn, um einen expliziten Aufruf zu machen.

MSDN erklärt im Grunde genau das gleiche in Abschnitt a>.

  

Sie können _endthread oder _endthreadex explizit aufrufen, um a zu beenden   Faden; _endthread oder _endthreadex wird jedoch automatisch aufgerufen   wenn der Thread von der als Parameter übergebenen Routine zurückkehrt   _beginthread oder _beginthreadex. Durch das Beenden eines Threads mit einem Aufruf von endthread oder _endthreadex wird die ordnungsgemäße Wiederherstellung von Ressourcen sichergestellt   für den Thread reserviert.

    
Roman R. 13.01.2013 13:21
quelle
2

Sie müssen es nicht nennen, wie bereits erwähnt. Was deinen Code angeht, denke ich, dass das letzte return 0; nicht einmal aufgerufen wird, weil _endthreadex() niemals zurückkommt. Dies könnte auch dazu führen, dass Destruktoren lokaler Objekte nicht aufgerufen werden (was meiner Meinung nach das MSDN sagen wollte), daher könnte die Verwendung dieser Funktion sogar in C ++ schädlich sein. Erwägen Sie Boost.Thread, sie haben eine Ausnahme speziell für die Beendigung eines Threads, die das Richtige tun sollte, wenn Sie den Thread irgendwo in der Mitte beenden möchten.

    
Ulrich Eckhardt 13.01.2013 11:09
quelle

Tags und Links