完成常规工作后取消POSIX线程

时间:2011-08-19 17:17:43

标签: c multithreading pthreads

有多个线程处理任务。一旦线程成功,所有线程都应该被取消,因为工作已经完成。一旦一个线程成功终止,我如何取消其他线程?谁将调用pthread_cancel ()以及成功线程如何告诉main或产生它的线程(返回值?)。

更新

我不想简单地调用exit因为我现在想要一些控制权。例如,在取消线程之后,我将通过成功的线程处理找到的结果,并且可以进行更多的处理,或者只是想让流程继续运行以进行更多的工作。

2 个答案:

答案 0 :(得分:4)

你可以选择一个简单的方案,其中main会做所有事情。

main启动所有线程并在某些信号量上执行down。当一个线程完成任务时,在该信号量上执行up。当main被解锁时,它可以pthread_cancel所有线程(然后pthread_join确保)。

这样main启动和停止所有线程,所以它应该非常简单。

答案 1 :(得分:1)

一种简单的方法是调用exit()来终止进程以及所有线程。它可以从任何线程调用。

另一种方法是让你的主线程产生并等待工作线程,并且一旦其中一个工作线程完成了:

  • 很好地告诉其他线程要终止并等到他们这样做,或者
  • 突然pthread_cancel()他们。默认情况下,线程是使用PTHREAD_CANCEL_DEFERRED创建的,这意味着它们在调用任何取消点函数之前不会终止,有关详细说明,请参阅Thread Cancellation。因此,如果线程正在进行一些长计算,您可能希望将其取消状态设置为PTHREAD_CANCEL_ASYNCHRONOUS以立即终止线程,请参阅pthread_setcanceltype