免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 13435 | 回复: 13
打印 上一主题 下一主题

[C] 请问:pthread_join有没有非阻塞的调用方式? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-02 14:51 |只看该作者 |倒序浏览
项目中需要实时监控线程的状态,如果线程已死,那么由监控线程重启。但是发现pthread_join没有非阻塞的调用方式。
目前想到两种方式,一种是工作线程定时更新某个标志位,然后监控线程定时检查该标志位,如果没有更新,那么重启工作线程。还有一种方式是在创建线程时,将线程的属性设置为PTHREAD_CREATE_DETACHED,之后调用pthread_join会直接返回EINVAL,如果线程不存在,那么就返回ESRCH。第一种方式不太适合,第二种方式又太不好使,线程终止之后,系统好像并不是马上就要回收线程的资源。
请教一下有没有监控线程运行状态的其他方式啊。谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-04-02 14:55 |只看该作者
单独开个进程不行么

论坛徽章:
0
3 [报告]
发表于 2009-04-02 14:56 |只看该作者
线程怎么样你应该知道
SirFang 该用户已被删除
4 [报告]
发表于 2009-04-02 16:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-04-02 17:03 |只看该作者

回复 #4 SirFang 的帖子

没有把问题说清楚哦,监控有很多种策略的啦

论坛徽章:
0
6 [报告]
发表于 2009-04-02 17:30 |只看该作者
不好意思,下午有点事情,没有来得及回复!
监控工作线程的状态主要是担心由于操作系统的原因,工作线程异常退出。或者是工作线程运行过程中,发现自己的运行状态出现问题,通知监控线程重启自己。

论坛徽章:
0
7 [报告]
发表于 2009-04-02 17:49 |只看该作者

回复 #6 wzabcd1234 的帖子

线程的信号,然后在信号处理函数中pthread_join,你觉得行不行

论坛徽章:
0
8 [报告]
发表于 2009-04-02 18:00 |只看该作者
原帖由 astezheng 于 2009-4-2 17:49 发表
线程的信号,然后在信号处理函数中pthread_join,你觉得行不行


哦,不好意思,刚那个不行,异常退出就不行了
文件锁可能可以解决你的问题,启动工作线程的时候,用工作线程的id创建文件,加独占写锁,以后监控线程就可以用阻塞或非阻塞的方式申请这个写锁
而工作线程自己可以释放这个锁,也可以在退出后由系统自动释放这个锁
这样,当监控线程可以拿到锁的时候,就证明某个工作线程退出了,然后重新来过

论坛徽章:
0
9 [报告]
发表于 2009-04-02 18:06 |只看该作者

回复 #7 astezheng 的帖子

你好,原来也考虑过用pthread_kill发线程信号,但是目前做的是一个静态库,如果发信号的话,那么调用这个库函数的进程就要处理被中断的系统调用,不太方便,所以就没有使用信号!

论坛徽章:
0
10 [报告]
发表于 2009-04-03 23:04 |只看该作者
#ifdef __USE_GNU
/* Check whether thread TH has terminated.  If yes return the status of
   the thread in *THREAD_RETURN, if THREAD_RETURN is not NULL.  */
extern int pthread_tryjoin_np (pthread_t __th, void **__thread_return) __THROW;

/* Make calling thread wait for termination of the thread TH, but only
   until TIMEOUT.  The exit status of the thread is stored in
   *THREAD_RETURN, if THREAD_RETURN is not NULL.

   This function is a cancellation point and therefore not marked with
   __THROW.  */
extern int pthread_timedjoin_np (pthread_t __th, void **__thread_return,
         __const struct timespec *__abstime);
#endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP