具有独特的结构作为参数C PTHREAD(pthread with unique struct as

2019-10-20 22:33发布

我有这一块是给我找麻烦代码。 我知道所有的线程读取相同的结构。 但我不知道如何解决这个问题。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
  int a,b;
} s_param;

void *
threadfunc(void *parm)
{
  s_param *param2 = parm; 
  printf("ID:%d and v:%d\n",param2->a,param2->b);
  pthread_exit(NULL);
}

int main(int argc, char **argv)
{
  pthread_t thread[3];
  int rc=0,i;
  void * status;

  for(i=0; i<3 ; ++i){
    s_param param;
    param.b=10;
    param.a=i;
    rc = pthread_create(&thread[i], NULL, threadfunc, &param ); // !!!!
    if(rc){
      exit(1);
    }
  }  

  for(i=0; i<3 ; ++i){
    pthread_join(thread[i],&status);
  }
  return 0;
}

输出:

ID:2 and v:10
ID:2 and v:10
ID:2 and v:10

而我需要什么:

ID:0 and v:10
ID:1 and v:10
ID:2 and v:10

Answer 1:

在for循环sparam的范围是循环中的静态。 当您设置.A和.B你一遍又一遍地写相同的结构,并且所有三个线程得到一个指向同一个结构。

相反,你可以使它们的排列像这样创建结构的三个独立的情况下..

int main(int argc, char **argv)
{
  pthread_t thread[3];
  s_param param[3];
  int rc=0,i;
  void * status;

  for(i=0; i<3 ; ++i){
    param[i].b=10;
    param[i].a=i;
    rc = pthread_create(&thread[i], NULL, threadfunc, &param[i] ); // !!!!
    if(rc){
      exit(1);
    }
  } 
... etc

应该指出,创造一个这样的数组的结构(和线程),因为你明明一个与主线程join()方法才是可行的。 如果你没有这样做加盟,你会被告知要么静态分配结构的主要功能外,还是从堆malloc的他们,因为一旦进入线程退出的主要功能,包含数组的堆栈帧将变得无效,不久将在一个不可预知的方式进行覆盖。



Answer 2:

param你的执行期间住在在堆栈中的同一个地方main功能。 你设置新值,每次,他们消灭了旧的价值观念,以及所有threadfunc s的看着在内存中的同一地点。 malloc的结构,或者从不同的存储位置创建它们。 (另外,对于跨线程的数据结构使用堆栈存储器是令人担忧的,只要功能你将它们设置在退出时,内存是无效的。)



Answer 3:

param是一个局部变量。 它超出范围,在循环的括号结束。 你需要mallocs_param每个线程。

或更好的,定义同时含有一个结构pthread_ts_param并使用该类型thread[3]

typedef struct {
  int a,b;
  pthread_t t;
} s_param;

int main(int argc, char **argv)
{
  s_param thread[3]; // declare threads + params together
  int rc=0,i;
  void * status;

  for(i=0; i<3 ; ++i){
    s_param *param = &thread[i]; // no persistent data declared here
    param->b=10;
    param->a=i;
    rc = pthread_create(&thread[i].t, NULL, threadfunc, &thread[i] ); // !!!!
    if(rc){
      exit(1);
    }
  }  
…


文章来源: pthread with unique struct as parameter C