从C中的线程返回一个值

时间:2014-04-24 03:31:57

标签: c unix pthreads posix

我是使用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);
}

1 个答案:

答案 0 :(得分:3)

来自Open Group pthread_exit documentation

  

线程终止后,对线程的本地(自动)变量的访问结果是不确定的。因此,不应将对现有线程的局部变量的引用用于pthread_exit()value_ptr参数值。

您将返回j的地址,这是您的线程函数中的局部变量。这是一个很大的禁忌。

至于如何解决这个问题,有一些解决方法可以立即解决。


第一种方法是使用全局变量作为返回值,每个线程一个。这通常也用于线程ID。


第二种是使用传递线程的参数。此时,您传入一个整数数组,但您可以轻松地传入包含那些整数 plus 的任意结构来存储返回代码。然后,线程可以在返回之前填充结构的该部分。


第三,取决于&#34;兼容&#34; intvoid*类型在您的实现中,您可以简单地使用指针本身来传回值。这需要线程做:

pthread_exit ((void*)j);

和主线将其转换回来:

printf ("%d\n", (int)res);

其中,第二个可能是&#34;最干净的&#34;,既不涉及较少想到的全局变量也不涉及潜在可疑的演员阵容。