【发布时间】:2023-03-15 03:37:01
【问题描述】:
这是一个函数,它应该递归地找到更精确的 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,所以请耐心等待。但是任何帮助找出导致结构被重置的原因将不胜感激。谢谢!
【问题讨论】:
-
发布的代码无法编译。它缺少
main()函数,缺少必要的#include语句。它也是非常递归的,会生成很多很多线程。另请注意,退出线程应通过调用pthread_exit() -
顺便说一句,在获取函数的地址时,“地址”(即
&)运算符是不必要的,所以pthread_create(&thread1, NULL, quad, arg1)是首选。 -
@user3629249
pthread_exit是可选的。void *return 工作得很好。类比是main:它可以通过exit(1)退出或只是return 1
标签: c multithreading debugging struct pthreads