On 25.09.2012 14:09, Christian Heimes wrote:
Am 25.09.2012 13:52, schrieb Diez Roggisch:
Angehalten oder abgebrochen? Wenn letzteres, dann vielleicht doch besser über das Modul multiprocessing gehen + einfach den Subprozess töten.
Und in Antwort auf deine andere Mail: nein, ich habe da keinen Beispielcode, und ich zweifele auch ein bisschen an der Durchführbarkeit.
Eine Garantie für dieses Verhalten kann es letztlich auch mit dem GIL nicht geben, denn wie gesagt - wenn du dich da in einem C-Callstack befindest, dann hat das GIL da keinen Einfluss mehr.
Diez hat absolut recht.
Das gewünschte Verhalten ist mit threads nicht umsetzbar. Wenn du einen Programmablauf zu jeder Zeit, sofort und zuverlässig beenden willst, dann musst du einen weiteren Prozess verwenden. Nicht mal pthread_cancel() oder pthread_kill() garantieren ein verlässliches und zeitnahes beenden eines Threads. Mal abgesehen davon, dass bei pthread_kill() dein Programm in einem undefinierten Zustand hängen wird.
Dein Problem ist unabhängig von Python und ist auch mit reinem C-Code nicht umsetzbar. Selbst bei Prozessen geht es mit SIGTERM, SIGKILL, SIGSTOP / SIGCONT nicht zuverlässig synchron.
Christian
Naja, SuspendThread(thread) und ResumeThread(thread) macht in C/C++ das was ich will. Detto Siganlhandling. Nur gibt's unter Windows kein SIGSTOP, SIGCONT, SIGUSER1/2 etc; das geht nur auf Nixen. Also wird's wohl eine C-nahe Lösung werden. Danke für deinen Kommentar. Wolf
Am 25.09.2012 17:39, schrieb wg:
Naja, SuspendThread(thread) und ResumeThread(thread) macht in C/C++ das was ich will. Detto Siganlhandling. Nur gibt's unter Windows kein SIGSTOP, SIGCONT, SIGUSER1/2 etc; das geht nur auf Nixen.
Also wird's wohl eine C-nahe Lösung werden.
SuspendThread() ist keine C/C++ spezifische Funktion sondern ein Teil der win32 Threading API. Die Funktion stoppt mitnichten den Thread synchron (nur user-mode code) und ist auch nicht für Produktionscode gedacht. Das ist ein gefährliches Debuggingfeature. http://msdn.microsoft.com/en-us/library/windows/desktop/ms686345%28v=vs.85%2...
wg wrote:
Naja, SuspendThread(thread) und ResumeThread(thread) macht in C/C++ das was ich will.
Jau. Inklusive der damit verbundenen Deadlocks, wenn man nicht höllischst aufpaßt. Was ein Grund ist, warum es aus den meisten APIs wieder rausgenommen wurde (Java, Delphi), wenn es dort denn überhaupt jemals drin war und mindestens als "deprecated" gekennzeichnet ist. Kurz gesagt: Pfoten weg. Vinzent. -- The most likely way for the world to be destroyed, most experts agree, is by accident. That's where we come in; we're computer professionals. We cause accidents. -- Nathaniel Borenstein
On 25.09.2012 18:30, Vinzent Hoefler wrote:
wg wrote:
Naja, SuspendThread(thread) und ResumeThread(thread) macht in C/C++ das was ich will.
Jau. Inklusive der damit verbundenen Deadlocks, wenn man nicht höllischst aufpaßt. Was ein Grund ist, warum es aus den meisten APIs wieder rausgenommen wurde (Java, Delphi), wenn es dort denn überhaupt jemals drin war und mindestens als "deprecated" gekennzeichnet ist.
Kurz gesagt: Pfoten weg.
Vinzent.
Nur keine Angst vor Software :-) und 'höllisch aufpassen' is normal wenn man programmiert. Danke für deine Warnungen. Wolf
Am 25.09.2012 17:39, schrieb wg:
Dein Problem ist unabhängig von Python und ist auch mit reinem C-Code nicht umsetzbar. Selbst bei Prozessen geht es mit SIGTERM, SIGKILL, SIGSTOP / SIGCONT nicht zuverlässig synchron.
Christian
Naja, SuspendThread(thread) und ResumeThread(thread) macht in C/C++ das was ich will.
Es kann sein, dass es das macht, was Du willst - aber nicht, was Du gesagt hast dass Du willst. SuspendThread garantiert nicht, dass der Zielthread *sofort* angehalten wird. Es kann schon sein, dass er u.U. noch etliche Takte weiterrechnet, bevor er angehalten wird. Vielmehr wird für den Zielthread lediglich der Suspend-APC beantragt, der dann "demnächst" den Thread auch anhält. Ciao, Martin
participants (4)
-
"Martin v. Löwis" -
Christian Heimes -
Vinzent Hoefler -
wg