2011-09-22 75 views
1

我已经开始尝试使用ios平台的POSIX线程。使用NSThread来回复它是相当艰巨的。POSIX线程在ios上

基本上在我的示例应用程序中,我有一个大数组填充类型mystruct。每隔一段时间(非常频繁),我都想执行一个任务,其中一个结构的内容在的背景中,所以我将它传递给detachnewthread以解决问题。

我认为我有基础知识,但我想在尝试转向更复杂的东西之前获得专业意见。 我在这里有什么似乎“o.k”,你能指出任何可能导致问题的缺失吗?你可以发现任何内存管理问题等...

struct mystruct 

{ 
pthread thread; 

int a; 
long c; 

} 


void detachnewthread(mystruct *str) 
{ 

    // pthread_t thread; 

    if(str) 
    { 
    int rc; 
     // printf("In detachnewthread: creating thread %d\n", str->soundid); 
     rc = pthread_create(&str->thread, NULL, DoStuffWithMyStruct, (void *)str); 
     if (rc){ 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      //exit(-1); 
     } 

    } 

    // 
    /* Last thing that main() should do */ 
    // pthread_exit(NULL);  


} 



void *DoStuffWithMyStruct(void *threadid) 
{ 
    mystruct *sptr; 
    dptr = (mystruct *)threadid; 



    // do stuff with data in my struct 
    pthread_detach(soundptr->thread); 

} 

回答

1

一个潜在的问题是如何在结构mystruct传递存储中创建。该变量的生命周期对其在线程中的使用非常关键。例如,如果detachnewthread的调用者已经在堆栈中声明并在线程完成之前返回,则它将是未定义的行为。同样,如果它是动态分配的,那么在线程完成之前有必要确保它没有被释放。

回应评论/问题:某种互斥体的必要性取决于用法。为了讨论,我将假定它是动态分配的。如果调用线程在创建“子”线程之前填充了结构的内容,并且可以保证在子线程退出之后它不会被释放,并且随后的访问是只读的,那么您不需要互斥体来保护它。如果结构包含子线程完成任务所需的信息,我可以想象这种情况。

然而,如果不止一个线程将访问该结构的内容一个或多个线程将被改变的数据(写入结构),那么你可能需要一个互斥量,以保护它。

+0

以防止被修改或从内存中删除的安全性我想我们会说互斥对吗? – dubbeat

+0

@dubbeat:我添加了一些信息来试图回答这个问题。如果您提供更多关于子线程如何使用结构内容的细节,我(或其他人)可能会给出更详细的答案。 –

1

尝试使用苹果公司的大中央调度(GCD),它将为您管理线程。 GCD提供了通过块将工作分派到由系统管理的各种队列的功能。一些队列类型是并发的,串行的,当然也是UI运行的主要队列。根据手头的CPU资源,系统将管理队列和必要的线程以完成工作。一个简单的例子,它显示了你怎么可以嵌套调用不同的队列是这样的:

__block MYClass *blockSelf=self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    [blockSelf doSomeWork]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [blockSelf.textField setStringValue:@"Some work is done, updating UI"]; 
    }); 
}); 

__block MyClass的* blockSelf =自简直是用来避免保留与块是如何工作的相关周期。

苹果的文档: http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

迈克灰Q值&博客文章: http://mikeash.com/pyblog/friday-qa-2009-08-28-intro-to-grand-central-dispatch-part-i-basics-and-dispatch-queues.html

+0

同意。除非您从其他平台移植代码,否则没有实际的理由可以考虑在iOS上直接使用POSIX线程。苹果的其他机制(特别是GCD)更强大,更优化,更易于使用。 –

+0

使用ARC时,'__block'不会阻止循环引用,所以您需要使用'__weak'(或iOS 4之前的'__unsafe_unretained')。无论如何,如果对象要保留对块的引用,则只需要防止保留周期,在这种情况下,它不是。 – Kevin