如何在linux上超时一个线程?

时间:2014-01-27 11:32:52

标签: c linux timer pthreads posix

在Linux上,使用C,我正在尝试启动多个线程(pthreads),如果它们在X秒后没有完成,我希望它们被杀死。我怎么建议我这样做? 我的第一个想法是使用POSIX计时器和一个列表将计时器设置为下一个计时器并终止相应的线程。它应该工作,但应该有一个更简单的方法来实现它。任何的想法? :)

2 个答案:

答案 0 :(得分:2)

此处,摘自http://www.cs.cf.ac.uk/Dave/C/node31.html

的简单样本
#include <pthread.h> 
#include <time.h> 

pthread_timestruc_t to;
pthread_cond_t cv; 
pthread_mutex_t m;
timestruct_t abstime; 
int ret; 

/* wait on condition variable */ 

ret = pthread_cond_timedwait(&cv, &m, &abstime);

pthread_mutex_lock(&m); 
/* initialize time variable */
to.tv_sec = time(NULL) + TIMEOUT; 
to.tv_nsec = 0; 

while (cond == FALSE) 
 {  err = pthread_cond_timedwait(&c, &m, &to); 
    if (err == ETIMEDOUT) 
       { /* timeout, do something */ 
       break; 
    } 
 }
pthread_mutex_unlock(&m);

您可以设置定义TIMEOUT宏的超时(以秒为单位)。

答案 1 :(得分:2)

首先,不要忘记有一种“简单”的方式来杀死线程。任何足够有用的线程都会占用资源 - 文件描述符,缓冲区,指向堆分配内存的指针,锁,condvars等。只是发送一个“砰的一声死”的信号很少做对除了最多的事情。琐碎的计划。

那说你必须考虑两个主要的事情:线程关闭方法和计时器。

它的关闭条件有几种可能性:(1)发送信号杀死线程(通常是坏的); (2)通过某种方法警告线程自行关闭(例如管道读取,在线程事件循环中设置开关,非致命信号等;(3)pthread_cancel机制。

计时器选项几乎可以引导您进入timer_create系列电话。如果您计划计时和取消多个线程,那么您需要多个计时器,alarmitimer不会削减它。 timer_create允许您使用多个选项。您可以将发出的信号定向到要取消的线程或监视线程,然后取消过期线程。如果您仔细阅读文档,您可以看到一些可能性,但哪种情况适合您的情况,只有您现在才能知道。