我想使用pthreads实现以下类型的场景: 线程池中有两种线程。第一种执行(比方说)fun1秒执行fun2。主线程启动这两个线程(为简单起见,假设池中只有两个工作线程,上述两种不同类型)。然后主线程等待其中一个线程完成。第一个完成的线程通知主线程,然后主线程应通知另一个工作线程退出执行其作业。循环还在继续。
现在,如果我想阻止线程执行其作业,这可能就像memmove / lock acquire,那么我认为最好只是杀死/取消该线程并重新创建它。你们觉得怎么样?
此外,如果我取消线程(pthread_cancel),那么我似乎必须调用pthread_join以确保它实际被取消然后重新创建它。这是真的吗?
谢谢, Nilesh制作。
答案 0 :(得分:2)
没有使用pthreads杀死线程的事情。正如您所发现的那样,取消了,但它取决于取消是否取决于线程。如果(1)它没有被pthread_setcancelstate(PTHREAD_CANCEL_DISABLE);
阻止,并且(2)该线程调用一个取消点的函数,则取消将被取消。
您还需要使用某种同步操作以确保取消已取消。执行此操作的一种方法是在线程上调用pthread_join
,但如果程序中的另一个点可能已经在其上调用pthread_join
,那么这可能会有问题(调用pthread_join
两次调用UB! )。在这种情况下,您可以安装一个取消清理处理程序,该处理程序发布到信号量或在运行时发出条件变量的信号,并等待通知。