如何在kthread_create创建的线程函数里面退出该线程呢????

汗晕倒 2010-11-17 02:03:14
如果用kthread_stop的话要知道kthread_create创建线程时返回的指针,线程函数本身怎么去获得这个指针呢??
其他用什么方法可以使得线程自动退出呢??
内核线程自身不会自动退出,那么线程函数返回的值是传给谁啊?那不是没有必要返回了?
...全文
513 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
汗晕倒 2010-11-26
  • 打赏
  • 举报
回复
谢谢各位,我现在发现一种方法是用kill_proc来实现的,通过发送接收信号量来实现。
不过我现在还是用kthread_should_stop来实现。用10L的方法。
知和行 2010-11-23
  • 打赏
  • 举报
回复
你看hub.c里是怎么干的
static int hub_thread(void *__unused)
{
do {
hub_events();
wait_event_interruptible(khubd_wait,
!list_empty(&hub_event_list) ||
kthread_should_stop());
try_to_freeze();
} while (!kthread_should_stop() || !list_empty(&hub_event_list));

pr_debug("%s: khubd exiting\n", usbcore_name);
return 0;
}
手机写程序 2010-11-19
  • 打赏
  • 举报
回复
while(!(kthread_should_stop())
{
if(error)
contine;
...
}
这样的话线程不干活了,只等kthread_stop信号了,就不会出问题了.
手机写程序 2010-11-19
  • 打赏
  • 举报
回复
实在不行就设全局标志位吧,不过这样会很难看.
汗晕倒 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 eyey1 的回复:]

while(!(kthread_should_stop())
{
if(error)
break;
...
}
这样有什么问题?你是想把driver自动卸载吗?
[/Quote]

我的意思是可能在while之前已经出错,while后面的内容已经没有意义了,这样我想退出线程函数,关闭线程。这样的话,到卸载程序的时候,因为有个kthread_stop的函数,这个函数没有得到kthread_should_stop函数的返回,它自己也不会返回,一直阻塞。我现在就是这样子,搞得卸载驱动的时候出错,卸载不了。。
可能我的设计不合理,请给点意见。
手机写程序 2010-11-19
  • 打赏
  • 举报
回复
while(!(kthread_should_stop())
{
if(error)
break;
...
}
这样有什么问题?你是想把driver自动卸载吗?
汗晕倒 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 unixstudier 的回复:]

自己不会man?不会google?
http://www.digipedia.pl/man/doc/view/kthread_create.9/

多简单的问题阿!我看你没必要作内核的编程了!
[/Quote]
见过装B,没有见过那么装B的,你说简单,那你回答我的问题啊。
你发个链接就是说kthread_create的用法,跟我的问题根本不搭边,man这个真不会,我就只会在我的系统man,这个是实话。至于google,google出来的东西也是别人问的问题,然后有人解答之后才是google的结果。我问问题都是经过思考和google一番之后才问的。
我问个问题你就说我没有必要做内核编程,我想大哥不是天才就是2哥,天生就会编程,编程过程中没问过问题??或者仅仅在这里装,你要装至少你显示出来你多能耐好不好???
抱歉,有些激动!!!
汗晕倒 2010-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 eyey1 的回复:]
可以在卸载驱动时用kthread_stop( ... )停止thread.

在thread里检测这个信号.

while(!(kthread_should_stop())
{
...
}
[/Quote]

这个我知道,我也在用,但是我说的是出现预知错误的情况下要线程自动退出,3楼我说了现在我使用的方法就是用do_exit()。
汗晕倒 2010-11-18
  • 打赏
  • 举报
回复
内核线程是不会退出的,不去退出它,它会永远跑下去。。
现在知道可以用do_exit()来退出线程~
UnixStudier 2010-11-18
  • 打赏
  • 举报
回复
自己不会man?不会google?
http://www.digipedia.pl/man/doc/view/kthread_create.9/

多简单的问题阿!我看你没必要作内核的编程了!
asmlearn 2010-11-18
  • 打赏
  • 举报
回复
没用过kthread,线程一般在进程退出后就自己退出啦。
是呀,线程没必要返回值呀,一般只有创建时知道是否成功就好了。
手机写程序 2010-11-18
  • 打赏
  • 举报
回复

可以在卸载驱动时用kthread_stop( ... )停止thread.

在thread里检测这个信号.

while(!(kthread_should_stop())
{
...
}

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧