2017-05-18 3 views
0

Ich arbeite derzeit an einem Multi-Client-Server, der select() verwendet, um mehrere Clients zu behandeln. Wenn ein Client jedoch eine Nachricht sendet, die umfangreiche Berechnungen erfordert, muss ich unter Verwendung von pthread_create() einen neuen Thread erstellen, damit mein Server auf andere Nachrichten von Clients reagieren kann. Sobald die Berechnung für diesen Client durchgeführt wurde, muss ich eine Nachricht an den Client zurückgeben können. Aber ich bin mir nicht sicher, wie ich wissen kann, ob dieser Thread fertig ist und wie man das Endergebnis erhält. Offensichtlich kann ich pthread_join() nicht verwenden, da das mein Serverprogramm während der Ausführung dieses neuen Threads blockiert. Also bietet C eine Funktion, die ich verwenden kann, um das Endergebnis dieses untergeordneten Threads zu erhalten? Ich möchte auch vermeiden, globale Variablen zu verwenden.C - pthread verwenden und auf einen Rückgabewert warten

+1

'Also bietet C eine Funktion, die ich verwenden kann, um das Endergebnis dieses untergeordneten Threads zu erhalten?' Ja, wählen Sie(). – ThingyWotsit

+0

Alternativ übergeben Sie den Thread das entsprechende fd und lassen Sie es direkt antworten. – ThingyWotsit

+0

@ThingyWotsit Ich dachte, Select() funktioniert nur auf Dateideskriptoren: | –

Antwort

1

können Sie einfach überprüfen, ob der Faden aus dem Haupt-Thread, bevor er (der nicht blockierende sein wird) beendet hat

Sie sollten bekommen, wie es von hier zu tun: How do you query a pthread to see if it is still running?

Ansonsten können Sie wahrscheinlich Senden Sie einfach die Antwort vom untergeordneten Thread zurück, Sie können Verbindungsinformationen als Parameter der Thread-Funktion übergeben.

1

Wenn der untergeordnete Thread den Thread, der in select() wartet, wenn die Verarbeitung abgeschlossen ist, aktivieren soll, können Sie pipe() verwenden, um eine Pipe zu erstellen. Der Thread, der select() aufruft, fügt der Dateideskriptorgruppe die Leseseite der Pipe hinzu, und der untergeordnete Thread schreibt auf die Schreibseite der Pipe, wenn sie ihre Arbeit beendet hat.

Sie können sogar das Ergebnis über die Pipe senden, wenn das Ergebnis nicht zu groß ist.