Richtigen Umgang mit threads im kernel?
Ich habe gesehen, bits von verstreuten Informationen, die alle um, aber ich kann nicht scheinen, um zu einer endgültigen Antwort. Wie reinigt man ein zombie-thread im kernel?
Nur um sicher zu stellen, und produzieren eine endgültig richtige Art des Umgangs mit threads im kernel, würde ich gerne Fragen, diese Frage mehr allgemein. , Wie Sie tun Sie erstellen, beenden und bereinigen einen thread im Linux-kernel?
Was ich habe, so weit ist diese:
thread_func:
exited = 0;
while (!must_exit)
do stuff
exited = 1;
do_exit(0)
init_module:
must_exit = 0;
exited = 1;
kthread_run(thread_func, ...) /* creates and runs the thread */
cleanup_module:
must_exit = 1;
while (!exited)
set_current_state(TASK_INTERRUPTIBLE);
msleep(1);
/* How do I cleanup? */
Die nächste Sache, die ich gefunden habe, um den cleanup-Lösung ist release_task, aber ich habe nicht, überall darüber zu reden. Ich habe mir vorgestellt, da die thread-Funktionen sind kthread_create
, kthread_run
etc, es sollte eine kthread_join
oder kthread_wait
, aber es war nicht. do_wait
auch schien wahrscheinlich, aber es dauert gar nicht struct task_struct *
.
Außerdem bin ich nicht sicher, ob do_exit
ist eine gute Idee, oder wenn überhaupt notwendig. Kann mir bitte jemand kommen mit die minimale Skizze, wie ein kthread erstellt werden soll, beendet und aufgeräumt?
den Weg habe ich verstanden, Sie entweder über die Ausfahrt selbst (mithilfe
do_exit
) oder poll kthread_should_stop
bis jemand (cleanup_module
) fordert kthread_stop
. Ich finde nicht überall zu sagen, ob kthread_stop
reinigt auch den Faden oder nicht. Was mich wundert ist, dass, wenn die Leute (im internet) empfehlen die Verwendung von entweder do_exit
oder was auch immer, nicht sollte es sein, einen Weg zu Bereinigung der thread nach do_exit
?Durch die Art und Weise, dieser ist, was ich Rede, wenn ich sage, ich kann nicht erreichen eine schlüssige Antwort. Es gibt eine Menge von widersprüchlichen Zeug gibt.
InformationsquelleAutor Shahbaz | 2012-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer der "richtigen" Möglichkeiten, dies zu tun ist, um Ihre thread-Funktion überprüfen, ob es
kthread_should_stop
und einfach zurückgeben, wenn es nicht anhalten zu müssen.Brauchen Sie nicht zu rufen
do_exit
, und wenn Sie wollenkthread_stop
es über die Modul-Funktion verlassen, sollten Sie wahrscheinlich nicht.Können Sie sehen, dieses durch nachschlagen in der Dokumentation für
kthread_create_on_node
imkernel/kthread.c
(Auszug aus Linux-kernel 3.3.1):Einen "passenden" Kommentar vorhanden ist für
kthread_stop
:(Und ich bin mir nicht sicher, wie Sie das tun - wahrscheinlich halten Sie sich auf dem
struct_task
mit einemget_task_struct
.)Wenn Sie den Weg einer thread-Erstellung erhalten Sie so etwas wie:
kthreadd_task
istinit/main.c
imreset_init
. Es läuft diekthreadd
- Funktion (auskthread.c
)Und die
kthread
Funktion selbst tut:... Also, wenn
your_thread_function
gibt einfach,do_exit
aufgerufen wird, mit seiner Rückkehr Wert. Keine Notwendigkeit, es selbst zu tun.do_exit()
(und sollte daher nicht nennenkthread_stop
), es würde nicht brauchen Bereinigung?Es können Orte gehen. Wenn die Aufgabe, zu der die task-Struktur sich bezieht, ist völlig fertig, und die task struct wird freigegeben, indem Sie den Ausgang Weg, die Kopie, die Sie haben in Ihrem Daten-Modul ist genau wie ein baumelnder Zeiger - Sie können es nicht verwenden.
Und ja, wenn Sie nicht Vorhaben
kthread_stop
deinem thread, kann es nennendo_exit
- und normal-cleanup passieren wird. Aber, wenn irgendwie dein thread verwaltet, um zu überleben Ihr Modul an, du bist in Schwierigkeiten.Okay, wenn die Bereinigung fertig ist, ist es in Ordnung. Ich habe sicher gestellt, dass in
cleanup_module
zu warten, bis die threads wieder. Ich habe gebissen worden, indem es bereits.Nur um sicher zu gehen,
kthread_stop
nicht warten, bis der thread abgeschlossen ist, auch. Es ist eine ziemlich nette wrapper. Aber ich denke, es könnte nicht gut geeignet, um Ihren Anwendungsfall.InformationsquelleAutor