iphone - 如何立即取消线程

标签 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_function 中使用标志来控制它的执行,它可能很有用,但它太复杂了。

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

那么问题一:如何立即取消线程?

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

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 代码中,如何使用类的对象?

最佳答案

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

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

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

最好重新构建线程函数,以便它们定期调用 isCancelled 并据此采取行动。如果操作正确,您可以通过检查某些点、在循环内检查、确保任何阻塞调用都有超时或解除阻塞的方法等来保证响应取消的最大延迟。

关于iphone - 如何立即取消线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906895/

相关文章:

ios - Swift NSMutableDictionary 删除对象

带有app后台的iOS远程推送通知

objective-c - 是NSMutableString的-appendString : method an efficient way to build up a large string?

ios - 在 Objective-C 中,当我不确定对象的类时如何调用对象的协议(protocol)选择器?

objective-c - 在 Swift 中将后台任务作为循环运行

ios - 如何避免使用子类化和/或委托(delegate)模式(Swift)为两个 View Controller 编写相同的函数

iOS 模拟器在应用程序执行时是黑色的

iphone - iOS OpenGL ES 逻辑缓冲区加载

iphone - 如何在 UILabel 上制作倒影?

iphone - 如何使用代码在iPhone中打开 native 闹钟?