将结构传递给pthread_create()

时间:2017-01-27 16:42:11

标签: c multithreading debugging struct pthreads

这是一个函数,它应该递归地找到更精确的Pi值并分成用户定义的线程数量来同时进行递归。

void* quad(void* argis){
    struct args* arg=argis;

    double m=(arg->l+arg->r)/2;
    double fm=func(m);
    double larea=(arg->fl+fm)*(m-arg->l)/2;
    double rarea = (fm+arg->fr)*(arg->r-m)/2;

    struct args* arg1 = (struct args*)malloc(sizeof(struct args));
    arg1->l=arg->l;
    arg1->r=m;
    arg1->fl=arg->fl;
    arg1->fr=fm;
    arg1->area=larea;

    struct args* arg2 = (struct args*)malloc(sizeof(struct args));
    arg2->l=m;
    arg2->r=arg->r;
    arg2->fl=fm;
    arg2->fr=arg->fl;
    arg2->area=rarea;

    if(fabs((larea+rarea)-arg->area)>error){
        if(threads<=1){
            void* p1=quad((void*)arg1);
            void* p2=quad((void*)arg2);
            larea=*((double*)p1);
            rarea=*((double*)p2);
            free(p1);
            free(p2);


        }
        else{
            pthread_t thread1, thread2;
            pthread_mutex_lock(&lock1);
            threads--;
            pthread_mutex_unlock(&lock1);

            pthread_create(&thread1, NULL, &quad, (void*)&arg1);
            pthread_create(&thread2, NULL, &quad, (void*)&arg2);

            void* ptr1;
            void* ptr2;

            pthread_join(thread1,&ptr1);
            pthread_join(thread2,&ptr2);


            pthread_mutex_lock(&lock1);
            threads++;
            pthread_mutex_unlock(&lock1);

            larea=*(double*)ptr1;
            rarea=*(double*)ptr2;


        }
    }
    free(arg1);
    free(arg2);

    double ret= (larea+rarea);
    double* poin=(double*)malloc(sizeof(double));
    *poin=ret;

    return (void*)poin;
}

然而,它不起作用。经过调查我发现问题似乎在这里:

pthread_create(&thread1, NULL, &quad, (void*)&arg1);
pthread_create(&thread2, NULL, &quad, (void*)&arg2);

struct arg1arg2中的所有参数在传递到新线程后都会变为0。 arg1arg2不是本地的,他们在堆中,我很确定线程共享堆,所以这不是问题。这不是你如何将参数传递给pthread_create()中的新线程吗?

这是我第一次使用pthreads,所以请耐心等待。但是,任何帮助找出导致结构重置的原因都将非常感激。谢谢!

1 个答案:

答案 0 :(得分:3)

由于arg1arg2 指针,您希望将它们传递给pthread_create()&#34;原样是&#34;:

  pthread_create(&thread1, NULL, &quad, arg1);

此外无需投射:

  void* p1=quad((void*)arg1);

只是做:

  void* p1=quad(arg1);

malloc()相同,无需投射其结果。

也不在这里:

  return (void*)poin;

  return poin;

很好。

在C转换中,任何指向/ void*的指针都是隐式完成的。