在Linux上,使用C,我正在尝试启动多个线程(pthreads),我希望如果它们在x秒后未完成,我希望它们被杀死。我如何建议我这样做?我的第一个想法是使用POSIX计时器和列表将计时器设置为下一个计时器并杀死相应的线程。它应该起作用,但是应该有一种更简单的方法来实施此操作。任何想法?:)
首先,将其放在脑海中,有一种"简单"杀死线程的方法。任何足够有用的线程都将持有资源 - 文件描述符,缓冲区,指针,以堆放分配的内存,锁,condvars等。只需发送一个"爆炸你死了"信号,很少是对除了最多的任何事情的正确事项琐碎的程序。
说您必须考虑两件事:线程关闭方法和计时器。
它的关闭条款有几种可能性:(1)发送信号以杀死线程(通常不好);(2)通过某种方法提醒线程(例如,读取管道,在线程事件循环中设置开关,非致命信号等);(3)pthread_cancel
机构。
计时器选项几乎将您带到timer_create
呼叫家族。如果您打算定时并取消多个线程,则需要多个计时器,并且alarm
和itimer
不会剪切。timer_create
允许您多个选项。您可以在要取消的线程或监视线程的线程上引导发射信号,该线程取消螺纹,然后取消逾期螺纹。如果您阅读文档,您可以看到一些可能性,但适合您的情况只有您现在才知道。
在这里,从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);
您可以在秒内设置定义超时宏的超时。