私は散在した情報のビットを見てきましたが、私は1つの最終的な答えには達していないようです。カーネルでゾンビスレッドをどのようにクリーンアップしますか?カーネル内のスレッドを適切に処理する方法は?
カーネル内のスレッドを正しく処理して正しい方法で処理するために、私はこの質問をもっと広くしたいと思います。 Linuxカーネルでスレッドを作成、終了、クリーンアップするにはどうすればよいですか?
は、私がこれまで持っていることはこれです:
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? */
私はクリーンアップ溶液に発見した最も近いものがrelease_taskですが、私はそれについて話をどこにも見つけることができませんでした。私はスレッドの機能がkthread_create
、kthread_run
などであると想像しましたが、kthread_join
またはkthread_wait
でなければなりませんでした。 do_wait
もそうですが、struct task_struct *
は受け付けていません。
さらに、do_exit
が良いアイデアか、必要な場合はどちらかというとわかりません。誰かが、kthreadをどのように作成し、終了し、クリーンアップするべきかの最小限のスケッチを思い付くことができますか?
私は、kthread_stop、またはkthread_should_stopがあることを覚えているようです。 –
@MartinJames、誰か( 'cleanup_module')が' kthread_stop'を呼び出すまで、自分が(do_exit'を使って)終了したり、 'kthread_should_stop'をポーリングしたりすることができます。私は 'kthread_stop'もスレッドをクリーンアップするかどうかについてはどこにも見当たりませんでした。私が不思議に思うのは、(インターネット上の)人々が 'do_exit'を使うことを提案していれば、' do_exit'の後にスレッドをクリーンアップするべきではないはずです。 – Shahbaz
ちなみに、[this](http://lwn.net/Articles/65178/)は私が決定的な答えに達することができないと言ったときの話です。そこには相容れないものがたくさんあります。 – Shahbaz