Chinaunix

标题: 请问:pthread_join有没有非阻塞的调用方式? [打印本页]

作者: wzabcd1234    时间: 2009-04-02 14:51
标题: 请问:pthread_join有没有非阻塞的调用方式?
项目中需要实时监控线程的状态,如果线程已死,那么由监控线程重启。但是发现pthread_join没有非阻塞的调用方式。
目前想到两种方式,一种是工作线程定时更新某个标志位,然后监控线程定时检查该标志位,如果没有更新,那么重启工作线程。还有一种方式是在创建线程时,将线程的属性设置为PTHREAD_CREATE_DETACHED,之后调用pthread_join会直接返回EINVAL,如果线程不存在,那么就返回ESRCH。第一种方式不太适合,第二种方式又太不好使,线程终止之后,系统好像并不是马上就要回收线程的资源。
请教一下有没有监控线程运行状态的其他方式啊。谢谢!
作者: @sky    时间: 2009-04-02 14:55
单独开个进程不行么
作者: 太平绅士    时间: 2009-04-02 14:56
线程怎么样你应该知道
作者: SirFang    时间: 2009-04-02 16:57
提示: 作者被禁止或删除 内容自动屏蔽
作者: astezheng    时间: 2009-04-02 17:03
标题: 回复 #4 SirFang 的帖子
没有把问题说清楚哦,监控有很多种策略的啦
作者: wzabcd1234    时间: 2009-04-02 17:30
不好意思,下午有点事情,没有来得及回复!
监控工作线程的状态主要是担心由于操作系统的原因,工作线程异常退出。或者是工作线程运行过程中,发现自己的运行状态出现问题,通知监控线程重启自己。
作者: astezheng    时间: 2009-04-02 17:49
标题: 回复 #6 wzabcd1234 的帖子
线程的信号,然后在信号处理函数中pthread_join,你觉得行不行
作者: astezheng    时间: 2009-04-02 18:00
原帖由 astezheng 于 2009-4-2 17:49 发表
线程的信号,然后在信号处理函数中pthread_join,你觉得行不行


哦,不好意思,刚那个不行,异常退出就不行了
文件锁可能可以解决你的问题,启动工作线程的时候,用工作线程的id创建文件,加独占写锁,以后监控线程就可以用阻塞或非阻塞的方式申请这个写锁
而工作线程自己可以释放这个锁,也可以在退出后由系统自动释放这个锁
这样,当监控线程可以拿到锁的时候,就证明某个工作线程退出了,然后重新来过
作者: wzabcd1234    时间: 2009-04-02 18:06
标题: 回复 #7 astezheng 的帖子
你好,原来也考虑过用pthread_kill发线程信号,但是目前做的是一个静态库,如果发信号的话,那么调用这个库函数的进程就要处理被中断的系统调用,不太方便,所以就没有使用信号!
作者: Aquester    时间: 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
作者: Aquester    时间: 2009-04-03 23:11
http://linux-man-pages.blogspot.com/
作者: 79hy    时间: 2009-04-04 11:14
原帖由 Aquester 于 2009-4-3 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 (pthre ...


楼上说的这个函数,网上有很好的解释
http://www.kernel.org/doc/man-pa ... d_tryjoin_np.3.html

但是我并没有在我的机器上找到这个函数的存在,是不是在最新的内核中才提供这些函数使用啊。

我在工作中也碰到需要非阻塞监控线程退出,我一直是用一个数组里存标志位来实现的。现在有这么好的函数,不知道要哪个内核才能使用呢?

[ 本帖最后由 79hy 于 2009-4-4 11:17 编辑 ]
作者: wzabcd1234    时间: 2009-04-04 19:37
我也没有在AIX上找到pthread_tryjoin_np这个函数,好像目前只有Linux实现了这个函数,
http://tech.ddvip.com/2008-09/122069047761381.html

8楼的兄弟给的方法不错,周二上班的时候试一下。不过如果工作线程比较多的话,临时文件会很多啊
作者: remark    时间: 2009-04-09 22:19
有高人能解释下第二种方法的问题是什么原因么




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2