我是使用Pthreads库在C中的线程新手。我使用pthread_exit(...)
返回值,并在main
中等待连接。问题是,我正在测试它并且使用两个线程,其中一个的结果是可以的,但另一个是没有意义的。例如,两个线程必须返回32,其中一个是OK,但另一个返回-123456789。有人可以帮帮我吗?
void *contar(void *arg){ //funcion thread
int i,j=0;
int *aux = (int *) arg;
int id = *aux;
int strip = N/T;
int inicio = id*strip ;
int fin = inicio + strip;
printf("%d %d %d \n",id,inicio,fin);
for(i=inicio;i<fin;i++){
if(VEC[i] == X){
j++;
}
}
pthread_exit(&j);
}
int main(int argc,char* argv[]){
int i,j,k;
void *res;
int *aux;
int acum=0;
N = (argc > 1)? atoi(argv[1]):n;
T = (argc > 2)? atoi(argv[2]):t;
X = (argc > 3)? atoi(argv[3]):x;
//Aloca memoria para el vetor
VEC =(int*)malloc(sizeof(int)*N);
aux=(int*)malloc(sizeof(int)*T);
//Aloca memoria para threads
threads=(pthread_t*) malloc(T*sizeof(pthread_t));
//Inicializa el vector VEC
for(i=0;i<N;i++){
VEC[i]=1;
}
pthread_attr_t attr;
pthread_attr_init (&attr);
for(i=0;i<T;i++){
aux[i]=i;
pthread_create(&(threads[i]),&attr,contar,&(aux[i]));
}
for(i=0;i<T;i++){
pthread_join((threads[i]),&res);
printf("%d \n",*(int *)res);
}
free(VEC);
free(threads);
free(aux);
free(res);
return(0);
}
答案 0 :(得分:3)
来自Open Group pthread_exit
documentation:
线程终止后,对线程的本地(自动)变量的访问结果是不确定的。因此,不应将对现有线程的局部变量的引用用于pthread_exit()value_ptr参数值。
您将返回j
的地址,这是您的线程函数中的局部变量。这是一个很大的禁忌。
至于如何解决这个问题,有一些解决方法可以立即解决。
第一种方法是使用全局变量作为返回值,每个线程一个。这通常也用于线程ID。
第二种是使用传递到线程的参数。此时,您传入一个整数数组,但您可以轻松地传入包含那些整数 plus 的任意结构来存储返回代码。然后,线程可以在返回之前填充结构的该部分。
第三,取决于&#34;兼容&#34; int
和void*
类型在您的实现中,您可以简单地使用指针本身来传回值。这需要线程做:
pthread_exit ((void*)j);
和主线将其转换回来:
printf ("%d\n", (int)res);
其中,第二个可能是&#34;最干净的&#34;,既不涉及较少想到的全局变量也不涉及潜在可疑的演员阵容。