以唯一结构作为参数C的pthread

以唯一结构作为参数C的pthread,c,parameters,struct,pthreads,C,Parameters,Struct,Pthreads,我有一段给我带来麻烦的代码。 我知道所有线程都在读取同一个结构。但我不知道如何解决这个问题 #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

我有一段给我带来麻烦的代码。 我知道所有线程都在读取同一个结构。但我不知道如何解决这个问题

#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:0 and v:10
ID:1 and v:10
ID:2 and v:10

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

应该提到的是,在这样的数组中创建结构和线程是可行的,因为您显然与主线程进行了连接。如果您没有进行连接,则建议您要么在主函数外部静态分配结构,要么从堆中malloc它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变得无效,并且很快将以不可预知的方式被覆盖。

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
应该提到的是,在这样的数组中创建结构和线程是可行的,因为您显然与主线程进行了连接。如果您没有进行连接,则建议您要么在主函数外部静态分配结构,要么从堆中malloc它们,因为一旦入口线程退出主函数,包含数组的堆栈帧将变得无效,并且很快将以不可预知的方式被覆盖。

在主函数执行期间,param位于堆栈中的同一位置。每次设置新值时,它们都会清除旧值,并且所有threadfuncs都会在内存中查看同一点。malloc结构,或者从不同的内存位置创建它们。此外,使用堆栈内存进行跨线程数据结构也是令人担忧的;一旦在中设置它们的函数退出,内存就无效。

在主函数执行期间,param位于堆栈中的同一位置。每次设置新值时,它们都会清除旧值,并且所有threadfuncs都会在内存中查看同一点。malloc结构,或者从不同的内存位置创建它们。此外,使用堆栈内存进行跨线程数据结构也是令人担忧的;一旦要在中设置它们的函数退出,内存就无效。

参数是一个局部变量。它在循环的大括号末尾超出范围。您需要为每个线程malloc一个新的s_参数

或者更好,定义一个同时包含pthread_t和s_参数的结构,并将该类型用于线程[3]

param是一个局部变量。它在循环的大括号末尾超出范围。您需要为每个线程malloc一个新的s_参数

或者更好,定义一个同时包含pthread_t和s_参数的结构,并将该类型用于线程[3]

s_param*param=线程[i];应该是s_param*param=&thread[i];s_param*param=线程[i];应该是s_param*param=&thread[i];
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);
    }
  }  
…