Tôi đã nhìn thấy các bit của thông tin phân tán xung quanh, nhưng tôi dường như không thể có được một câu trả lời cuối cùng. Làm thế nào để bạn làm sạch một sợi zombie trong hạt nhân?Cách xử lý đúng luồng trong hạt nhân?
Chỉ để đảm bảo và tạo ra một cách xử lý chính xác cuối cùng các chuỗi trong hạt nhân, tôi muốn hỏi câu hỏi này rộng hơn. Làm thế nào để bạn tạo, chấm dứt và làm sạch một luồng trong hạt nhân Linux?
Những gì tôi có cho đến nay là thế này:
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? */
Điều gần nhất tôi đã tìm thấy các giải pháp dọn dẹp là release_task, nhưng tôi đã không tìm thấy bất cứ nơi nào nói về nó. Tôi tưởng tượng vì các chức năng của luồng là kthread_create
, kthread_run
v.v., phải có kthread_join
hoặc kthread_wait
, nhưng không có. do_wait
cũng có vẻ như có khả năng, nhưng không mất struct task_struct *
.
Hơn nữa, tôi không chắc chắn nếu do_exit
là một ý tưởng hay, hoặc nếu cần thiết. Có thể ai đó vui lòng đưa ra phác thảo tối thiểu về việc làm thế nào một kthread nên được tạo ra, chấm dứt và làm sạch?
Tôi dường như nhớ rằng có kthread_stop, hoặc kthread_should_stop, giống như vậy. –
@MartinJames, theo cách tôi hiểu, bạn có thể thoát khỏi chính mình (sử dụng 'do_exit') hoặc thăm dò ý kiến' kthread_should_stop' cho đến khi ai đó ('cleanup_module') gọi' kthread_stop'. Tôi đã không tìm thấy bất cứ nơi nào nói rằng liệu 'kthread_stop' cũng làm sạch các chủ đề hay không. Điều gì làm tôi ngạc nhiên là, nếu mọi người (trên internet) đề nghị sử dụng 'do_exit' hoặc bất cứ điều gì, không nên có một cách để dọn dẹp sợi chỉ sau' do_exit'? – Shahbaz
Bằng cách này, [this] (http://lwn.net/Articles/65178/) là những gì tôi nói về khi tôi nói tôi không thể đạt được một câu trả lời kết luận. Có rất nhiều thứ xung đột. – Shahbaz