有多个线程在任务上工作。一旦线程成功,所有的线程都应该取消,因为工作已经完成。一旦一个线程成功终止,我怎样才能取消其他线程?谁将调用pthread_cancel()
以及成功的线程将如何告知main
或产生它的线程(返回值?)。完成常见工作后取消POSIX线程
UPDATE
我不想简单地调用exit
就像我现在想要一些控制。例如,在取消线程之后,我将通过成功的线程处理找到的结果,并且可能会执行一些更多的处理,或者只是想让该进程继续运行以进行更多的工作。
有多个线程在任务上工作。一旦线程成功,所有的线程都应该取消,因为工作已经完成。一旦一个线程成功终止,我怎样才能取消其他线程?谁将调用pthread_cancel()
以及成功的线程将如何告知main
或产生它的线程(返回值?)。完成常见工作后取消POSIX线程
UPDATE
我不想简单地调用exit
就像我现在想要一些控制。例如,在取消线程之后,我将通过成功的线程处理找到的结果,并且可能会执行一些更多的处理,或者只是想让该进程继续运行以进行更多的工作。
你可以选择一个简单的方案,其中主要做的一切。
已有main
启动所有线程,并在某些信号上执行down
。当一个线程完成任务时,在该信号量上执行一个up
。当main被解锁时,它可以pthread_cancel
所有的线程(然后pthread_join
来确认)。
这样main
启动和停止所有线程所以它应该是相当简单的。
一个简单的方法是调用exit()
与所有的线程终止一起的过程。它可以从任何线程调用。
另一种方式是让你的主线程产卵和等待工作线程,而且一旦工作线程完成或者:
pthread_cancel()
他们。默认情况下,线程是使用PTHREAD_CANCEL_DEFERRED
创建的,这意味着它们在调用任何取消点函数之前不会终止,请参阅Thread Cancellation以获得较好的说明。所以,如果你的线程正在做一些长时间的计算,你可能想要设置它们的取消状态为PTHREAD_CANCEL_ASYNCHRONOUS
立即终止线程,参见pthread_setcanceltype。
为什么你需要多个线程来完成这个任务,如果你要扔掉其中一个人所做的工作?只需在一个线程中完成一次工作。 – zwol
说,我有一个巨大的列表线性搜索,我会传递列表段到不同的线程,一旦找到匹配,返回。其他人被取消。 – phoxis
我想这是唯一的选择,但如果你的数据中有任何结构的话,那么这里有更好的算法。 – zwol