我想使用 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/