我已经开始使用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/