如何立即取消线程

时间:2012-10-16 02:56:06

标签: iphone objective-c ios

我使用NSThread创建一个新线程,然后它正在执行thread_funtion,我想取消该线程,我使用[thread cancel],但线程将继续。

NSThread *thread=[[NSThread alloc] initWithTarget:self selector:@selector(thread_funtion) object:nil];
[thread start];

-(void)thread_funtion
{
     //my code
}

我知道在thread_funtion使用标志来控制它的执行,它可能很有用,但它太复杂了。

-(void)thread_funtion
{
      if(flag)
    {
        //some code
    }
    if(flag)
    {
        //some code
    }
}

问题1:如何立即取消线程?

然后我使用另一种方法创建一个新线程:

pthread_t id;
int ret;
ret=pthread_create(&id,NULL,thread_function,NULL);
if(ret!=0){
    printf ("Create pthread error!\n");
    exit (1);
}

然后我使用pthread_cancel(id),线程将立即停止。 但是在thread_function中:

void* thread_function(void *arg)
{
    //This is not a function of the class, So I can't use self.somobject !
}

所以问题是,在c代码中,如何使用类的对象?

1 个答案:

答案 0 :(得分:3)

NSThread取消只是在线程中设置一个标志,它可以通过调用isCancelled来发现它。如果线程意图继续,它停止线程。

这实际上是的事情。根据我在多线程方面的长期经验,我认为theads应该完全控制自己,包括他们自己的生命周期。

当他们锁定资源或者他们在更新关键结构的中途时杀死线程不是一个好主意。

重新构建您的线程函数是一个好主意,以便他们定期调用isCancelled并对其进行操作。如果你做得对,你可以通过检查某些点,在循环内检查,确保任何阻塞调用有超时或解除阻塞的方法等来保证对取消响应的最大延迟,等等。