c - pthread线程池场景

标签 c pthreads threadpool

我想使用 pthreads 实现以下场景: 线程池中有两种线程。第一种执行(比如说)fun1,第二种执行 fun2。主线程启动这两个线程(为简单起见,假设池中只有两个工作线程,分别为上述两种不同类型)。然后主线程等待其中一个线程完成。第一个完成的线程通知主线程,然后主线程应该通知其他工作线程停止执行它的工作。循环继续。

现在,如果我想停止线程执行其工作,这可能类似于 memmove/lock acquire,那么我认为最好是杀死/取消该线程并重新创建它。大家怎么看?

此外,如果我取消线程 (pthread_cancel),那么我似乎必须调用 pthread_join 以确保它确实被取消,然后重新创建它。是真的吗?

谢谢, 尼勒什。

最佳答案

没有用 pthreads 杀死线程这样的事情。正如您所发现的,存在取消,但它是否对取消起作用取决于线程。仅当 (1) 未被 pthread_setcancelstate(PTHREAD_CANCEL_DISABLE); 阻止且 (2) 线程调用作为取消点的函数时,才会执行取消。

关于需要使用某种同步操作来确保已对取消采取行动,您也是正确的。一种方法是在线程上调用 pthread_join,但如果程序中的另一个点可能已经在其上调用 pthread_join(调用 pthread_join 两次调用 UB!)。在这种情况下,您可以安装一个取消清理处理程序,该处理程序在运行时发布到信号量或向条件变量发出信号,并以这种方式等待通知。

关于c - pthread线程池场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7018254/

相关文章:

java - 如何将当前的vaadin session 提供给线程池的旧线程?

java - java中如何将主线程加入到线程池中

c++ - 5 检查的倍数

c - 在真值表上填写 n 个输入值

c++ - 如何从 pthread ID 检索 pthread_key_t?

task - 线程池和上下文切换(任务)?

c - Vim:使用 gcc 编译

c - 我不明白 char 数组和 char * string 之间的区别

C函数打印两次,只用一个线程调用一次

c - pthread中PTHREAD_CREATE_JOINABLE的用法是什么?