【问题标题】:catch an exiting thread in c在c中捕获一个退出线程
【发布时间】:2012-01-27 22:22:48
【问题描述】:

我有一个线程池。 main() 函数启动了经典的池设置。一个老板线程和几个工作线程。大部分代码已完成,但缺少的部分是错误处理。

当老板/工作线程之一发生错误时,将调用 pthread_exit()。 main() 线程如何知道池中出现问题以便重新启动它?

【问题讨论】:

  • 你为什么不让你的线程自己重启而不是退出呢?这听起来像是一个更简洁的设计......
  • @R.. 这就是我的想法。在 C 语言中有点困难,因为在线程的外部级别没有可以引发和捕获的异常,但是应该可以在任务中生成某种错误报告,然后循环执行另一个错误报告。不得不说,这种事情在 C++ 中要容易得多...
  • 不,如果您正在调用 pthread_exit,那么除非您已经使用取消处理程序来展开堆栈并执行清理任务,否则您可以直接调用 longjmp 回到您开始的位置打电话给pthread_exit。只需将pthread_exit 调用更改为longjmp。或者,您可以在调用pthread_exit 之前简单地调用pthread_create,并创建一个新线程来替换调用线程。
  • 这听起来很可疑,@R..;使用longjmp() 本身就很危险,而使用pthread_exit() 对我来说听起来不是一个好建议。
  • @JonathanLeffler:如果没有安装取消处理程序,那么直接调用pthread_exitlongjmp 回到初始线程入口函数调用pthread_exit 在行为上绝对没有区别。一旦你在那里,你可以只是goto线程进入函数的开始而不是退出。没有发生任何危险的事情。

标签: c linux pthreads


【解决方案1】:

如果你想保存错误或恢复信息,或者你想要一个非阻塞函数,你可以使用一个条件变量和一个关联的互斥体和一个包含失败线程、错误和你需要的恢复信息的结构。所有这些变量都应该是全局的。

pthread_cond_t cond  = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct error_info err;

在boss线程你必须先初始化err结构,然后锁定互斥体。

pthread_mutex_lock(&mutex);

然后您使用 pthread_cond_wait 等待条件发生。

pthread_cond_wait(&cond, &mutex);

条件发生后,您处理错误并使用 pthread_join 从线程获取返回值。注意 pthread_cond_wait 是阻塞的,如果你想要一个非阻塞版本,你应该使用 pthread_cond_timedwait ,它有第三个参数,一个 struct timespec *,它保存等待到期的绝对系统时间。最后记得解锁你的互斥锁。

pthread_mutex_unlock(&mutex);

在失败的工作线程处,在退出之前,您应该先锁定互斥体,然后填充 err 结构,向老板线程发出信号,解锁互斥体并退出。要向老板线程发出信号,您应该使用 pthread_cond_signal 函数。

pthread_cond_signal(&cond);

【讨论】:

    【解决方案2】:

    你可以使用:

    pthread_join( pthread_t child, void** );
    

    获取线程的返回值。 pthread_join 是一个阻塞函数,它将等待线程退出。您可以从以下位置传递 pthread_join 的参数:

    void pthread_exit(void *value_ptr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多