Linux下,主线程怎么知道子线程是否结束?

laiwen68 2010-08-23 10:03:23
主线程用pthread_create建立了子线程,子线程不会自己结束,因此,需要主线程在子线程运行结束之后杀死子线程(比如:用pthread_kill),问题是,怎么做,才能保证子线程已经正常中止了?

开始考虑的是在子线程的最后一句用sem_post,但是,子线程sem_post之后,主线程运行pthread_kill的时侯,并不能保证子线程的入口函数已正常返回啊.........
...全文
857 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
djjlove_2008 2010-08-23
  • 打赏
  • 举报
回复
在linux下不清楚,在WINDOWS中的MFC封装的函数可以良好解决此类问题。
laiwen68 2010-08-23
  • 打赏
  • 举报
回复
所谓加时限,就是让主线程等待子线程结束的时间,不是无限的,比如:等待10分钟,如果子线程还不能结束,那么,主线程就让强制结束它(最好,还能相对比较安全地结束)。
xy_zhang 2010-08-23
  • 打赏
  • 举报
回复
pthread_join()函数是一个线程阻塞的函数,调用它的函数将一直等待到被等待的线程结束为止,当函数返回时,被等待线程的资源被收回。你说加时限是什么意思呢?另外,如果子线程已经处于detached状态,pthread_join()会失败,返回EINVAL。
laiwen68 2010-08-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 laiwen68 的回复:]
主线程用pthread_create建立了子线程,子线程不会自己结束,因此,需要主线程在子线程运行结束之后杀死子线程(比如:用pthread_kill),问题是,怎么做,才能保证子线程已经正常中止了?

开始考虑的是在子线程的最后一句用sem_post,但是,子线程sem_post之后,主线程运行pthread_kill的时侯,并不能保证子线程的入口函数已正常返回啊.........
[/Quote]

多谢提醒!!! 找到问题所在了,程序有BUG,detach的设置也有问题......

另外,如果想给pthead_join()加个时限,有没有什么思路或替代的方法???

再次感谢!!!


macrojj 2010-08-23
  • 打赏
  • 举报
回复
子线程正常返回 它就正常终止了啊。

这是最健康的方式。
xy_zhang 2010-08-23
  • 打赏
  • 举报
回复
比较奇怪啊,什么叫子线程不会自己结束?子线程也是执行一个线程函数,会结束的啊,如果里面是个死循环,就没有你说的正常中止这种概念了。

主线程pthread_create()后,可以用pthread_join()来等待子线程结束。
xy_zhang 2010-08-23
  • 打赏
  • 举报
回复
pthread_timedjoin_np()是posix的吗?不了解

http://zh-cn.w3support.net/index.php?db=so&id=73468
feimashenhua 2010-08-23
  • 打赏
  • 举报
回复
线程函数执行完后,就是正常终止。线程间的通讯方式有好几种,建议看一下基础知识。
laiwen68 2010-08-23
  • 打赏
  • 举报
回复
多谢各位朋友们的捧场!!!

查了一下资料,发现LINUX还有一个函数可用:pthread_timedjoin_np,好象可以有时限地等待;

决定先用 pthread_timedjoin_np 等待,接着再按xy_zhang在7楼的建议的方法去KILL。。。







yujixi123 2010-08-23
  • 打赏
  • 举报
回复
pthread_join
xy_zhang 2010-08-23
  • 打赏
  • 举报
回复
可以试一下这样:
在主线程里面设置一个定时器,或者sleep()你需要的时间长度,timeout后,去进行pthread_kill操作:

int kill_rc = pthread_kill(thread_id,0);

if(kill_rc == ESRCH)
printf("the specified thread did not exists or already quit\n");
else if(kill_rc == EINVAL)
printf("signal is invalid\n");
else
printf("the specified thread is alive\n");


同时,子线程里面处理SIGKILL信号,signal(SIGKILL,sig_handler),这样好一些,不然如果当时还没有结束,就被强制结束了。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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