C-如何在Linux上超时一个线程



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

首先,将其放在脑海中,有一种"简单"杀死线程的方法。任何足够有用的线程都将持有资源 - 文件描述符,缓冲区,指针,以堆放分配的内存,锁,condvars等。只需发送一个"爆炸你死了"信号,很少是对除了最多的任何事情的正确事项琐碎的程序。

说您必须考虑两件事:线程关闭方法和计时器。

它的关闭条款有几种可能性:(1)发送信号以杀死线程(通常不好);(2)通过某种方法提醒线程(例如,读取管道,在线程事件循环中设置开关,非致命信号等);(3)pthread_cancel机构。

;(3)

计时器选项几乎将您带到timer_create呼叫家族。如果您打算定时并取消多个线程,则需要多个计时器,并且alarmitimer不会剪切。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);

您可以在秒内设置定义超时宏的超时。

最新更新