Win32-API: CreateThread(), Threads koordinieren – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self?srt=yes Win32-API: CreateThread(), Threads koordinieren Tue, 15 Sep 20 07:59:59 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775615?srt=yes#m1775615 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775615?srt=yes#m1775615 <p>Hallo Kameraden,</p> <p>gerade komme ich mal wieder in den Genuss, mich in meinem alten Spezialgebiet Softwareentwicklung zu bewegen. Und bin auf ein Phänomen mit einer win32-Anwendung gestoßen.</p> <p>Um eine zusätzliche Aktion <em>nebenläufig</em> zu realisieren (Kommunikation über eine Sellerie-Schnittstelle), ohne das Hauptprogramm zu beeinflussen, habe ich diese zusätzliche Aktion in einen eigenen Thread verlagert - also ein paar sequentielle Aufrufe von WriteFile() und ReadFile() auf ein Comm-Handle. Nun habe ich beim Testen festgestellt, dass beim Schließen des Programms hin und wieder zwar das Programmfenster verschwindet, der eigentliche Prozess aber als Zombie übrigbleibt. Im Taskmanager ist er dann noch zu sehen.</p> <p>Aufgefallen ist das, weil das Programm sich dann beim Neustart beklagt, die COM-Schnittstelle könne nicht geöffnet werden, weil sie noch von einem anderen Prozess belegt ist. Das Debugging gestaltet sich ein bissl unbequem, da der zusätzliche Thread in einer DLL steckt, die "on demand" geladen wird.</p> <p>Ist es in win32 tatsächlich Pflicht, das Beenden aller Threads zu überwachen und abzuwarten, bevor man das Hauptprogramm enden lässt? Ich hätte gedacht, wenn der Thread noch ein paar Sekunden läuft, dann verzögert sich halt auch das Beenden des Hauptprozesses. Aber anscheinend ist das nicht so.</p> <p>Hat da jemand Erfahrungen?</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Win32-API: CreateThread(), Threads koordinieren Tue, 15 Sep 20 08:30:32 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775618?srt=yes#m1775618 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775618?srt=yes#m1775618 <p>Hallo Martin,</p> <blockquote> <p>Sellerie-Schnittstelle</p> </blockquote> <p>Prust </p> <p>Ich kenne das nur aus .net. Da muss ich beim Starten eines Threads sagen, ob das ein Backgroundthread ist oder nicht, und wenn es keiner ist, läuft der Prozess weiter, bis alle Nonbackground-Threads beendet sind.</p> <p>Grundsätzlich kann dieses Verhalten ja Absicht sein, dass ein Prozess sein Hauptprogramm beendet und nur im Hintergrund noch herummacht.</p> <blockquote> <p>Ich hätte gedacht, wenn der Thread noch ein paar Sekunden läuft, dann verzögert sich halt auch das Beenden des Hauptprozesses.</p> </blockquote> <p>Ist das so? Endet der Thread? Oder ist er vielleicht noch aktiv und wartet auf irgendwas? Solange der auf weiteren Sellerie wartet, dürfte er nicht zu Ende sein.</p> <p>Ich habe <a href="https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread" rel="nofollow noopener noreferrer">hier</a> mal nachgelesen. Da stehen einige Hinweise am Ende. Betrifft Dich davon irgendwas?</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Win32-API: CreateThread(), Threads koordinieren Tue, 15 Sep 20 20:45:44 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775645?srt=yes#m1775645 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775645?srt=yes#m1775645 <p>Moin,</p> <blockquote> <p>Ist es in win32 tatsächlich Pflicht, das Beenden aller Threads zu überwachen und abzuwarten, bevor man das Hauptprogramm enden lässt? Ich hätte gedacht, wenn der Thread noch ein paar Sekunden läuft, dann verzögert sich halt auch das Beenden des Hauptprozesses. Aber anscheinend ist das nicht so.</p> </blockquote> <p>Schreibst du dein Programm in C++? Seit C++ 2011 gibt es eine <a href="https://en.cppreference.com/w/cpp/thread" rel="nofollow noopener noreferrer">Thread Library</a>, die dir die Arbeit deutlich erleichtert.</p> <p>Viele Grüße<br> Robert</p> Win32-API: CreateThread(), Threads koordinieren Tue, 15 Sep 20 08:55:21 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775619?srt=yes#m1775619 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775619?srt=yes#m1775619 <p>Hallo Rolf,</p> <blockquote> <blockquote> <p>Sellerie-Schnittstelle</p> </blockquote> <p>Prust </p> </blockquote> <p>kanntest du das noch nicht?? Das spielen sie in Holland doch schon auf der Luftpumpe.</p> <blockquote> <p>Grundsätzlich kann dieses Verhalten ja Absicht sein, dass ein Prozess sein Hauptprogramm beendet und nur im Hintergrund noch herummacht.</p> </blockquote> <p>Ja, dafür kann ich mir auch sinnvolle Szenarien vorstellen. Aber das würde ich dann eher so lösen, dass der Hauptprozess noch kontrolliert in seiner Message-Loop rumrennt und nur sein Fenster schließt. Dann hätte er (vom Berechtigungsstatus abgesehen) den Status eines Services.</p> <blockquote> <blockquote> <p>Ich hätte gedacht, wenn der Thread noch ein paar Sekunden läuft, dann verzögert sich halt auch das Beenden des Hauptprozesses.</p> </blockquote> <p>Ist das so? Endet der Thread?</p> </blockquote> <p>Das sollte er zumindest. Wie gesagt, das läuft in einer "frei fliegenden" DLL und ist deshalb schwierig zu debuggen. Aber der Thread arbeitet nur eine endliche Queue von WriteFile() und ReadFile() ab, jedesmal mit Timeout, so dass diese Aufrufe nach ein paar 100ms zurückkehren, notfalls auch erfolglos.</p> <blockquote> <p>Oder ist er vielleicht noch aktiv und wartet auf irgendwas? Solange der auf weiteren Sellerie wartet, dürfte er nicht zu Ende sein.</p> </blockquote> <p>Das ist klar, aber das gibt die Programmlogik <em>eigentlich</em> nicht her.</p> <blockquote> <p>Ich habe <a href="https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread" rel="nofollow noopener noreferrer">hier</a> mal nachgelesen. Da stehen einige Hinweise am Ende. Betrifft Dich davon irgendwas?</p> </blockquote> <p>Diesen Abschnitt der Winapi-Doku habe ich schon gelesen. Der einzige Satz, den ich im Hinblick auf dieses Problem für interessant halte, ist dieser:</p> <blockquote> <p>ExitProcess does not complete until there are no threads in their DLL initialization or detach routines.</p> </blockquote> <p>Das lese ich so, dass ExitProcess() implizit das Beenden von Threads abwartet, die in DllMain() gestartet wurden. Bei mir wird der Thread aber nicht schon beim Initialisieren der DLL (also nicht in DllMain()) gestartet, sondern erst bei Bedarf aus einer "gewöhnlichen" exportierten Funktion heraus.</p> <p>Anyway, ich habe das inzwischen umgebaut und warte beim Beenden des Programms nun explizit ab, bis der Thread sich ordnungsgemäß verabschiedet hat. Ich komme aber frühestens heute nachmittag wieder ans Live-System zum Testen.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Win32-API: CreateThread(), Threads koordinieren Tue, 15 Sep 20 16:00:32 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775634?srt=yes#m1775634 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775634?srt=yes#m1775634 <p>Hallo nochmal,</p> <blockquote> <p>Anyway, ich habe das inzwischen umgebaut und warte beim Beenden des Programms nun explizit ab, bis der Thread sich ordnungsgemäß verabschiedet hat. Ich komme aber frühestens heute nachmittag wieder ans Live-System zum Testen.</p> </blockquote> <p>nun habe ich die so umgebaute DLL mitsamt ihrer Host-Applikation bestimmt 20mal oder noch öfter im Lauf des Nachmittags gestartet und wieder beendet - nicht nur um die Beenden-Problematik zu untersuchen, sondern auch, um viele unterschiedliche Einstellungen zu testen. Ein Zombie, wie ursprünglich beschrieben, ist nicht wieder aufgetaucht.</p> <p>Ich nehme also an, dass es tatsächlich so ist: Man darf sich anscheinend nicht einfach so davonstehlen, während der Hund (Thread) noch frei rumläuft.</p> <p>Trotzdem danke fürs Mitdenken.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Win32-API: CreateThread(), Threads koordinieren Wed, 16 Sep 20 06:32:33 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775648?srt=yes#m1775648 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775648?srt=yes#m1775648 <p>Hallo,</p> <blockquote> <blockquote> <p>Ist es in win32 tatsächlich Pflicht, das Beenden aller Threads zu überwachen und abzuwarten, bevor man das Hauptprogramm enden lässt?</p> </blockquote> <p>Schreibst du dein Programm in C++?</p> </blockquote> <p>nein, reines Plain Vanilla C.</p> <blockquote> <p>Seit C++ 2011 gibt es eine <a href="https://en.cppreference.com/w/cpp/thread" rel="nofollow noopener noreferrer">Thread Library</a>, die dir die Arbeit deutlich erleichtert.</p> </blockquote> <p>Nach <em>erleichtern</em> sieht das nicht gerade aus. Mit meiner reinen Windows-API-Lösung brauche ich genau zwei Funktionen: CreateThread() und GetExitCodeThread() - wobei letztere mir vor allem verrät, ob der Thread noch läuft oder schon beendet ist.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div> Win32-API: CreateThread(), Threads koordinieren Wed, 16 Sep 20 08:52:33 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775653?srt=yes#m1775653 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775653?srt=yes#m1775653 <p>Moin,</p> <blockquote> <blockquote> <blockquote> <p>Ist es in win32 tatsächlich Pflicht, das Beenden aller Threads zu überwachen und abzuwarten, bevor man das Hauptprogramm enden lässt?</p> </blockquote> </blockquote> </blockquote> <p>ich habe noch einmal kurz nachgedacht: Die Antwort lautet sowohl unter Windows als auch Linux/Unix <strong>Ja</strong>. Es ist ein Unterschied ob ich den Thread <em>joine</em> oder <em>detache</em>. Im zweiten Fall läuft der Thread unabhängig vom aufrufenden Thread.</p> <blockquote> <blockquote> <p>Seit C++ 2011 gibt es eine <a href="https://en.cppreference.com/w/cpp/thread" rel="nofollow noopener noreferrer">Thread Library</a>, die dir die Arbeit deutlich erleichtert.</p> </blockquote> <p>Nach <em>erleichtern</em> sieht das nicht gerade aus. Mit meiner reinen Windows-API-Lösung brauche ich genau zwei Funktionen: CreateThread() und GetExitCodeThread() - wobei letztere mir vor allem verrät, ob der Thread noch läuft oder schon beendet ist.</p> </blockquote> <p>Gut, dafür bräuchte man in C++ wohl eine Statusvariable, wenn der Thread nicht gejoined werden kann. Aber das Prinzip ist ziemlich ähnlich. Interessanterweise scheint es in C++ keine andere Möglichkeit zu geben herauszufinden, ob der Thread läuft.</p> <p>Viele Grüße<br> Robert</p> Win32-API: CreateThread(), Threads koordinieren Wed, 16 Sep 20 12:02:07 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775659?srt=yes#m1775659 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775659?srt=yes#m1775659 <p>Hallo Martin,</p> <blockquote> <p>CreateThread() und GetExitCodeThread()</p> </blockquote> <p>ich sehe auf der CreateThread Seite gerade noch was anderes:</p> <blockquote> <p>A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multithreaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.</p> </blockquote> <p>Verwendest Du die CRT im Thread? Das ist ja fast kaum vermeidbar...</p> <p><em>Rolf</em></p> <div class="signature">-- <br> sumpsi - posui - obstruxi </div> Win32-API: CreateThread(), Threads koordinieren Wed, 16 Sep 20 12:44:50 Z https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775660?srt=yes#m1775660 https://forum.selfhtml.org/self/2020/sep/15/win32-api-createthread-threads-koordinieren/1775660?srt=yes#m1775660 <p>Hallo,</p> <blockquote> <blockquote> <p>A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multithreaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.</p> </blockquote> </blockquote> <p>das habe ich auch gelesen. Und wenn das "terminate the process in low-memory conditions" die einzige blöde Nebenwirkung ist, könnte ich das sogar verschmerzen. Aber ...</p> <blockquote> <p>Verwendest Du die CRT im Thread?</p> </blockquote> <p>Nein. </p> <blockquote> <p>Das ist ja fast kaum vermeidbar...</p> </blockquote> <p>Würde ich nicht sagen. Für viele CRT-Standardfunktionen hält das Windows-API eine Alternative bereit, etwa wsprintf() anstatt sprintf(), lstrlen() anstatt strlen(), ReadFile() und WriteFile() anstatt fread() und fwrite(), und noch einige Kandidaten in der Art.</p> <p>Ich bin gerade nochmal die knapp 600 Quellcode-Zeilen für meine DLL durchgegangen und habe <em>keinen</em> CRT-Funktionsaufruf gefunden.</p> <p>Live long and <s>pros</s> healthy,<br>  Martin</p> <div class="signature">-- <br> Home is where my beer is. </div>