在Linux上,使用C,我正在尝试启动多个线程(pthreads),如果它们在X秒后没有完成,我希望它们被杀死。我怎么建议我这样做? 我的第一个想法是使用POSIX计时器和一个列表将计时器设置为下一个计时器并终止相应的线程。它应该工作,但应该有一个更简单的方法来实现它。任何的想法? :)
答案 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
系列电话。如果您计划计时和取消多个线程,那么您需要多个计时器,alarm
和itimer
不会削减它。 timer_create
允许您使用多个选项。您可以将发出的信号定向到要取消的线程或监视线程,然后取消过期线程。如果您仔细阅读文档,您可以看到一些可能性,但哪种情况适合您的情况,只有您现在才能知道。