目标C:如何在Objective-C中的另一个线程中杀死一个线程?

时间:2009-12-18 07:38:44

标签: objective-c multithreading

我正在尝试设置多线程应用。其中一个线程正在作为后台进行一些数据传输。现在这个线程在完成工作后自动自杀。 不知怎的,我需要在另一个线程中杀死这个线程,以便立即停止它的工作。是否有任何api或方法来实现这一目标?

6 个答案:

答案 0 :(得分:11)

总之,你不能。或者,更确切地说,你不应该。在任何情况下都不是,也不是。

当A杀死B时,线程A绝对没有办法知道线程B的确切状态。如果B持有任何锁定或在系统调用中或在A杀死它时调用系统框架,那么应用程序的结果状态将是不确定的。

实际上 - 它在某种程度上是确定性的,因为你几乎可以肯定在不久的将来会发生崩溃。


如果需要终止线程B,则需要以受控方式执行此操作。最常见的方法是使用cancel标志或方法进行设置/调用。然后,线程B需要定期检查此标志或检查方法是否已被调用,清理它正在做什么,然后退出。

也就是说,你将不得不修改线程B中的逻辑以支持这一点。

答案 1 :(得分:3)

bbum是正确的,你不想简单地杀死一个线程。您可以更安全地终止进程,因为它与系统的其余部分隔离。因为线程与进程的其余部分共享内存和资源,所以杀死它可能会导致各种各样的问题。

那么,你应该做什么?

处理此问题的唯一正确方法是让主线程向工作线程发送消息,告知其退出。工作线程必须定期检查此消息并自愿退出。

一种简单的方法是使用标志,两个线程都可以访问的布尔变量。如果你有多个工作线程,你可能需要更复杂的东西。

答案 2 :(得分:0)

这不是一个坏主意吗? (如果另一个线程处于关键部分中的某些事情,它可能会使事物处于不一致状态。)你不能只设置一些共享标志变量,并让另一个线程定期检查它以查看它是否存在应该停止吗?

答案 3 :(得分:0)

您可以做的一件事是在前端线程和后台线程之间传递消息,可能使用this之类的东西来促进消息传递。

答案 4 :(得分:0)

如果您正在使用pthread,那么您尝试使用'pthread_kill',我曾经尝试过很长时间它没有为我工作,基本上如果线程在某些阻塞调用中它将无法工作。

确实,杀死一个帖子不是一个好选择,如果你正在寻找某种方法来修复某些问题,那么你可以试试这个。

答案 5 :(得分:0)

在我个人看来,最好让一个线程自然地运行。很难保证试图杀死一个线程的效果。