2016-05-10 11 views
1

Hallo Ich bin mit diesem Problem fest und ich kann nicht herausfinden, welche die beste Lösung dafür ist:Korrekter Multithread-Programmabschluss. C

Ich habe einen Prozess mit einigen Threads. Alle Threads haben ein maskiertes Signal und nur eines (SignalHandler), das prüft, ob noch Signale anstehen.

Jetzt möchte ich auch andere Threads beenden, wenn es ein SIGINT (zum Beispiel) erhält. Wie kann ich es richtig machen? Das Hauptproblem ist, dass der andere Thread möglicherweise auf eine Zustandsvariable wartet oder in einer accept() -Wartung wartet (für Socket-Verbindungen). Ich denke, eine gute Sache wäre, setze eine Variable wie "shouldEnd" und setze sie auf 1, wenn Threads aufhören sollten zu arbeiten. Ist das eine gute Idee? Und was ist mit dem Wartenden? Meistens für den, der auf eine Socketverbindung wartet?

Antwort

1

Also, in erster Linie wissen wir nicht, was Sie für Threads verwenden. Sie betrachten könnten libboost dafür verwenden, wie es das Leben einfacher mit RAII style locks and whatnot.

Auf jeden Fall machen wird, nur der gewählte Faden Ihres Prozesses (typischerweise main(), in den meisten Beispielen), wird the signal, unless you've enabled signal masking fangen. Wenn Sie die Gewinde wollen sauber herunterzufahren, müssen Sie nur:

  1. Wakeup die Fäden auf accept()by modifying your FD set to include a pipe that can also wake up the blocking call warten.
  2. Melden Sie einfach die Condvars, auf die die anderen Threads warten, und legen Sie eine Art Mutex-geschütztes Boolean/Flag fest, um den Thread zu benachrichtigen, dass es früher beendet werden soll (zB: mutexLock()l; bool bExitEarly = true; signal(condVar); mutexUnlock();).
  3. Assuming you spawned the threads as joinable (ie: non-detached), stellen Sie sicher, dass Sie eine Kopie des Zeigers zu jedem Thread-Objekt haben, und rufen Sie thread_join() auf jedem von ihnen, nachdem Sie ihnen signalisiert haben zu stoppen. Dadurch wird sichergestellt, dass die Threads vollständig gestoppt werden, bevor main() beendet wird. Wenn Sie dies nicht tun, main() könnte beendet werden, bevor die Threads fertig sind, und nur zwangsweise die Threads töten, während sie in der Mitte ihrer Shutdown-Logik sind, die chaotisch ist, und könnte dazu führen, dass Ihr Programm zum Absturz oder schlimmer.
+0

Ich verwende Pthreads. 1) Danke werde das überprüfen 2) Also sollte ich Broadcast() an alle Threads derzeit auf eine Zustandsvariable warten? 3) Bereits getan. Danke, dass du es aufgezeigt hast. – Levenlol

+0

@ Levenlol ** (1) ** Gut. Sie sollten überlegen, ob Sie eine Art Wrapper dafür schreiben, wenn es in mehreren Threads verwendet wird. Es wird Ihnen viele Kopfschmerzen auf der Straße ersparen. ** (2) ** Ja. Die Signalisierung sollte auch in Ordnung sein, es sei denn, Sie haben mehrere Threads, die auf denselben condvar warten. Ist das der Fall? Wenn dies der Fall ist, sollten Sie eine Art "bIsThreadAwake" -Flag für jeden Thread verwenden, um zu verfolgen, welche die Übertragung erhalten haben, falls jemand nicht gewartet hat, als die Übertragung stattfand (potentieller Deadlock). ** (3) ** Gute Arbeit. Scheint, du hast deine Hausaufgaben gemacht. Wenn dies hilfreich ist, markieren Sie bitte "Akzeptiert". TY. – DevNull

+0

2) Wenn der Thread wach war und die Übertragung nicht empfangen wurde? Ich bin dabei: vor dem Aussetzen (warten (cvar, mtx)) überprüft der Thread, ob es im Fall pthread_exit beendet werden sollte. Kann eine gute Lösung sein? – Levenlol

Verwandte Themen