2012-01-27 72 views
0

我有一个线程池。 main()函数启动经典池设置。一个老板线程和一些工作线程。大部分代码已完成,但缺少的部分是错误处理。捕捉到一个正在退出的线程c

当一个boss/worker线程发生错误时,调用pthread_exit()。 main()线程如何知道池中出现错误以重新启动它?

+0

为什么你不让自己重启自己而不是退出?这听起来像一个更清洁的设计... – 2012-01-28 00:41:57

+0

@R ..这是我的想法。在C语言中没有任何异常可以在线程的外层引发并捕获,但它应该可以在任务中生成某种错误报告,并且可以循环执行另一个错误报告。我不得不说,这种事情在C++中更容易... – 2012-01-28 01:00:42

+0

不,如果您调用'pthread_exit',那么除非您已经使用取消处理程序来展开堆栈并执行清理任务,否则您可以调用'longjmp'回到你开始的地方,而不是调用'pthread_exit'。这只是将'pthread_exit'调用改为'longjmp'的问题。或者,您可以在调用'pthread_exit'之前调用'pthread_create'并创建一个新线程来替换调用线程。 – 2012-01-28 01:23:30

回答

0

如果你想保存错误或恢复信息,或者你想非阻塞功能,可以与相关的互斥一起使用的条件变量,并包含结构失败的线程,错误和您需要的恢复信息。所有这些变量应该是全球性的。

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结构,信号老板线程,解锁互斥锁,并退出。要发信号给boss线程,应该使用pthread_cond_signal函数。

pthread_cond_signal(&cond); 
0

您可以使用:

pthread_join(pthread_t child, void**); 

让你的线程的返回值。 pthread_join是一个阻塞函数,它将等待一个线程退出。您可以传递参数的pthread_join函数:

void pthread_exit(void *value_ptr);