Nếu bạn xem cách kthread()
là implemented, tại dòng 209, hãy gọi threadfn(data)
và lưu trữ mã thoát trong ret
; sau đó nó gọi do_exit(ret)
.
Vì vậy, trở lại đơn giản từ threadfn
của bạn là đủ.
Nếu bạn nhìn vào tài liệu của kthread_stop, nó nói rằng nó:
- bộ
kthread_should_stop
để return true;
- đánh thức luồng;
- đợi chuỗi thoát.
Điều này có nghĩa là chỉ nên gọi từ kthread_stop()
từ bên ngoài một sợi để dừng chỉ. Vì nó đợi thread kết thúc, bạn không được gọi nó trong thread hoặc bạn có thể bế tắc!
Hơn nữa, tài liệu nói rằng nó chỉ thông báo cho chuỗi mà nó nên thoát ra, và rằng thread nên gọi kthread_should_stop
để tìm hiểu về điều này. Vì vậy, một dài sống threadfn
có thể làm điều này:
int thread_fn() {
printk(KERN_INFO "In thread1");
while (!kthread_should_stop()) {
get_some_work_to_do_or_block();
if (have_work_to_do())
do_work();
}
return 0;
}
Nhưng nếu chức năng của bạn là không tồn tại lâu dài, gọi kthread_should_stop
là không cần thiết.
Tôi đoán bạn sẽ có thể biết bằng cách xem mã bắt đầu một chuỗi và xem liệu nó có thiết lập ngăn xếp của chuỗi có địa chỉ trả về sẽ ở đâu đó không. –