我已经开始使用ios平台对POSix线程进行实验。使用NSThread来来来回是相当令人生畏的。

基本上在我的示例应用程序中,我有一个大型数组,其中填充了mystruct类型。我经常(非常频繁地)想要在背景中使用这些结构之一的内容执行任务,因此我将其传递给detachnewthread来开始工作。

我认为我的基础知识有所欠缺,但是在尝试研究更复杂的内容之前,我想先征询专业意见。
我在这里显示的内容是否“OK”,您能指出任何可能引起问题的遗漏吗?您能发现任何内存管理问题等吗?

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);

}

最佳答案

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

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

但是,如果有多个线程将访问结构的内容,则一个或多个线程将在更改数据(写入结构),那么您可能确实需要一个互斥体来保护它。

关于ios - iOS上的POSIX线程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7518449/

10-11 22:53
查看更多