【问题标题】:How can I timeout a thread on linux?如何在 linux 上使线程超时?
【发布时间】:2014-01-27 11:32:52
【问题描述】:

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

【问题讨论】:

  • 贴一些你试过的代码...

标签: c linux timer pthreads posix


【解决方案1】:

首先,请不要忘记有一种“简单”的方法可以杀死线程。任何足够有用的线程都会保存资源——文件描述符、缓冲区、指向堆分配内存的指针、锁、condvars 等。仅仅发送一个“bang you're dead”信号很少是正确的,除了大多数小程序。

也就是说,您必须考虑两件主要的事情:线程关闭方法和计时器。

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

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

【讨论】:

  • 我看不出选项 1 应该如何工作。将SIGKILL 发送到某个线程会杀死整个进程以及所有其他线程。但也许我误解了你的想法。
  • @alk,我正在考虑一个可以处理的信号,因为它们几乎都必须处理,否则它们最终会压缩过程。你经常看到人们想从阻塞的系统调用中吹出一个线程并在中断上保释而不是使用管道技巧或诸如此类的东西。这就是我的全部内容,但你说得对,这是一个懒惰的答案。
【解决方案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 宏的超时时间。

【讨论】:

  • 不会锁定调用线程吗?我想我可以为每个“线程”创建 2 个线程。
  • (解锁)锁定只是一个示例。主要功能是pthread_cond_timedwait()。这是一个关于如何创建超时条件的想法。
猜你喜欢
  • 2011-01-17
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2019-07-12
相关资源
最近更新 更多