我想使用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!),那么这可能会有问题。在这种情况下,您可以安装一个取消清理处理程序,该处理程序在运行时向信号量发送信号或向条件变量发出信号,并以这种方式等待通知。