在c中捕获一个退出线程

标签 c linux pthreads

我有一个线程池。 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/

相关文章:

c - 队列类型数据结构使用数组实现

c - Cairo Graphics 在其他语言中比 c 慢吗?例如在 Haskell 中?

Linux:创建 mmap()able 虚拟文件(例如 SPI 内存)

linux - 两个文件与 while .sh 的比较

c - 仅在线程中发生冲突时才使用互斥锁

c - 互斥量的默认属性是什么?

java - 我可以计算计算机中的图像被查看了多少次并将计数数存储在java文件或cpp文件中?

linux - 在系统启动时执行命令的 Bash 脚本

c++ - 为什么通过以下方式将ID传递给线程很不好?

c - C 中大型二维数组导致的段错误