【发布时间】: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_exit和longjmp回到初始线程入口函数调用pthread_exit在行为上绝对没有区别。一旦你在那里,你可以只是goto线程进入函数的开始而不是退出。没有发生任何危险的事情。