【问题标题】:Return a value from a thread in C从 C 中的线程返回一个值
【发布时间】:2014-04-24 03:31:56
【问题描述】:

我是 C 中使用 Pthreads 库的线程的新手。我使用pthread_exit(...) 返回值,并在main 在连接处等待它。问题是,我正在测试它并且使用两个线程,其中一个的结果是好的,但另一个是没有意义的东西。例如,两个线程都必须返回 32,其中一个正常,但另一个返回 -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);
}

【问题讨论】:

    标签: c unix pthreads posix


    【解决方案1】:

    来自Open Group pthread_exit documentation

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

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

    至于如何解决这个问题,有几个解决方法会立即浮现在脑海中。


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


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


    第三,根据您的实现中intvoid* 类型的“兼容”程度,您可以简单地使用指针本身来传回值。这将需要线程执行:

    pthread_exit ((void*)j);
    

    以及将其转换回来的主线:

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

    其中,第二个可能是“最干净的”,既不涉及较少考虑的全局变量,也不涉及潜在可疑的演员表。

    【讨论】:

    • 那我应该返回什么?
    • @user3420326,我添加了一些关于如何解决此问题的选项。可能还有其他人,但这至少应该是一个足够好的开始。
    猜你喜欢
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    相关资源
    最近更新 更多