2011-08-19 41 views
5

有多个线程在任务上工作。一旦线程成功,所有的线程都应该取消,因为工作已经完成。一旦一个线程成功终止,我怎样才能取消其他线程?谁将调用pthread_cancel()以及成功的线程将如何告知main或产生它的线程(返回值?)。完成常见工作后取消POSIX线程

UPDATE

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

+0

为什么你需要多个线程来完成这个任务,如果你要扔掉其中一个人所做的工作?只需在一个线程中完成一次工作。 – zwol

+2

说,我有一个巨大的列表线性搜索,我会传递列表段到不同的线程,一旦找到匹配,返回。其他人被取消。 – phoxis

+0

我想这是唯一的选择,但如果你的数据中有任何结构的话,那么这里有更好的算法。 – zwol

回答

4

你可以选择一个简单的方案,其中主要做的一切。

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

这样main启动和停止所有线程所以它应该是相当简单的。

+0

是的,我的设计是一个主要的设计,这是一个好主意。任何事情都可以用信号完成? – phoxis

+0

@phoxis可以肯定的是,你可以使用'pthread_kill'发送一个信号给一个线程。仍然在这个规则中,我觉得它会很混乱(我想不出从信号处理程序中离开线程的简单方法)。但不要听我的话,我总是回避信号。 – cnicutar

+0

在主要产卵孩子的情况下,我喜欢互斥解决方案,我将使用它。当问题是线程正在被递归地或随机地产生而没有任何共同的父亲时,我询问信号,在这种情况下,信号可以工作。或者还有其他办法来处理这种随机产卵的取消? – phoxis

1

一个简单的方法是调用exit()与所有的线程终止一起的过程。它可以从任何线程调用。

另一种方式是让你的主线程产卵和等待工作线程,而且一旦工作线程完成或者:

  • 告诉好听的其他线程终止,等待,直到他们这样做,或
  • 突然pthread_cancel()他们。默认情况下,线程是使用PTHREAD_CANCEL_DEFERRED创建的,这意味着它们在调用任何取消点函数之前不会终止,请参阅Thread Cancellation以获得较好的说明。所以,如果你的线程正在做一些长时间的计算,你可能想要设置它们的取消状态为PTHREAD_CANCEL_ASYNCHRONOUS立即终止线程,参见pthread_setcanceltype
+0

是的,这是我在发布之前使用的一种方式,但我现在想要更多的控制。例如,在线程被取消后,我将通过成功的线程处理找到的结果,并可能做一些更多的处理。 – phoxis

+0

看到更新然后:) –

+0

任何事情都可以用信号完成? – phoxis