ios - iOS 上的 POSIX 线程

标签 ios multithreading posix

我已经开始使用 ios 平台尝试 POSix 线程。使用 NSThread 是相当令人畏惧的。

基本上在我的示例应用程序中,我有一个充满 mystruct 类型的大数组。每隔一段时间(非常频繁),我想在后台中使用这些结构之一的内容执行一项任务,因此我将其传递给 detachnewthread 以启动任务。

我认为我已经掌握了基础知识,但在尝试继续更复杂的事情之前,我想获得专业意见。 我这里的东西看起来“没问题”吗?你能指出任何可能导致问题的遗漏吗?你能发现任何内存管理问题等吗...

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/

相关文章:

ios - UITableViewCell 中的 UILabel 重叠(自动布局)

objective-c - 调试 iOS 应用程序时如何在 Xcode 控制台中打印 unsigned char?

c++ - OpenCV 的级联分类器未充分利用 CPU 的能力

java - 如何让一个线程做一些工作,然后让另一个线程加入并完成工作?

c - pthread_cancel会在线程做IO的时候取消一个线程吗?

iOS - 如何删除 UIButton 边框颜色?

ios - Swift ScrollView 和键盘问题

c# - 如何避免手动启动的线程死亡?

c - 如何将0x00写入文件

c - 使用条件变量的简单多线程堆栈实现