这是一个函数,它应该递归地找到更精确的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 arg1
和arg2
中的所有参数在传递到新线程后都会变为0。 arg1
和arg2
不是本地的,他们在堆中,我很确定线程共享堆,所以这不是问题。这不是你如何将参数传递给pthread_create()
中的新线程吗?
这是我第一次使用pthreads,所以请耐心等待。但是,任何帮助找出导致结构重置的原因都将非常感激。谢谢!
答案 0 :(得分:3)
由于arg1
和arg2
是指针,您希望将它们传递给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*
的指针都是隐式完成的。