Ich habe einen Code, der eine pthread
spawns, die versucht, eine Socket-Verbindung zu einem Remote-Host aufrechtzuerhalten. Wenn die Verbindung jemals unterbrochen wird, versucht sie, die Verbindung mit einem blockierenden connect()
-Aufruf an ihrem Socket wiederherzustellen. Da der Code in einem separaten Thread ausgeführt wird, interessiert mich nicht die Tatsache, dass es die synchrone Socket-API verwendet.Wie unterbricht man einen Thread, der eine blockierende Socket-Verbindung durchführt?
Das heißt, bis es Zeit für meine Anwendung zum Beenden kommt. Ich möchte einen gewissen Anschein eines geordneten Herunterfahrens machen, also verwende ich Thread-Synchronisations-Primitive, um den Thread aufzuwecken und zu signalisieren, dass er beendet wird, dann führe einen pthread_join()
auf dem Thread aus, um darauf zu warten, dass er beendet wird. Das funktioniert großartig, es sei denn, der Thread ist in der Mitte eines connect()
Aufrufs, wenn ich das Herunterfahren befehle. In diesem Fall muss ich auf die Verbindung warten, bis die Zeit abgelaufen ist, was sehr lange dauern könnte. Dies führt dazu, dass das Herunterfahren der Anwendung lange dauert.
Was ich tun möchte ist, den Anruf zu connect()
in irgendeiner Weise zu unterbrechen. Nachdem der Anruf zurückkehrt, wird der Thread mein Beendigungssignal bemerken und sauber herunterfahren. Da connect()
ein Systemaufruf ist, dachte ich, dass ich es möglicherweise absichtlich unterbrechen könnte, indem ich ein Signal verwende (wodurch der Aufruf EINTR
zurückkehrt), aber ich bin nicht sicher, ob dies eine robuste Methode in einer POSIX-Thread-Umgebung ist.
Hat jemand irgendwelche Empfehlungen, wie dies zu tun ist, entweder mit Signalen oder über eine andere Methode? Beachten Sie, dass der Aufruf connect()
in einem Bibliothekscode nicht möglich ist, den ich nicht ändern kann. Daher ist das Wechseln zu einem nicht blockierenden Socket keine Option.
Bitte legen Sie auch ein Sprachkennzeichen. – Tudor
Ich schreibe eigentlich in Python, aber ich suche nichts Sprachspezifisches. Sie können davon ausgehen, dass ich unter Linux arbeite. –
Schließen Sie die Steckdose. –