我有一个线程池。 main() 函数启动经典池设置。一个老板线程和一些工作线程。大部分代码已完成,但缺少的部分是错误处理。
当 boss/worker 线程之一发生错误时,将调用 pthread_exit()。 main() 线程如何知道池中出现问题以便重新启动它?
最佳答案
如果您想保存错误或恢复信息,或者您想要一个非阻塞函数,您可以将条件变量与关联的互斥体以及包含失败线程、错误和您需要的恢复信息的结构一起使用。所有这些变量都应该是全局的。
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);
关于在c中捕获一个退出线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9040852/