2009-08-29 22 views
2

我有一个第三方C++库,我已经把它放入它自己的线程(目前使用NSThread)调用。我想给用户停止执行该线程的能力。 (我很清楚这可能导致的所有问题,但我仍然希望这样做。)如何用Objective C杀死一个线程?

根据Apple's Thread Programming Guide,Cocoa有可能这样做。这也适用于iPhone吗?还是我必须依靠Posix线程来完成我的目标?

干杯

MrMage

+4

如果你认为你想停止一个线程直接和外部没有某种同步原语来停止它在一个已知点然后,不,你不明白它可能造成的问题。其中一个问题很可能是崩溃或损坏的内存。不可避免的如此。 – bbum 2009-08-29 18:35:46

+0

即使当我想杀死的线程(工作线程)不使用任何主线程的对象,反之亦然? 图书馆的开发者告诉我,他很高兴地使用这种线程取消来阻止他的工作线程,并且他没有遇到这样的主要问题。 – MrMage 2009-08-29 21:46:37

+0

如果他的库以任何方式使用任何系统库调用,则强制杀死线程将导致未定义的行为。这包括malloc(),甚至。即使它现在看起来有效,它是否继续在软件更新和体系结构更改上工作也是一个完全不同的问题。 – bbum 2009-08-30 06:35:16

回答

10

正确的方式来阻止你的线程执行是要求它很好地停止执行。然后,在你的线索中,你会听取这样的要求,并在适当的时候服从他们。

由于很页面链接到您说:

虽然可可,POSIX,和多服务提供程序直接杀线程,使用这种程序的强烈反对。杀死一个线程可以防止线程自行清理。由该线程分配的内存可能会泄漏,并且线程当前正在使用的任何其他资源可能无法正确清理,从而在稍后创建潜在问题。

如果您预计需要在操作过程中终止线程,则应该从一开始就设计线程以响应取消或退出消息。对于长时间运行的操作,这可能意味着要定期停止工作并检查是否收到了这样的消息。如果消息确实要求线程退出,线程将有机会执行任何需要的清理并正常退出;否则,它可能会重新开始工作并处理下一块数据。