将 for 循环索引传递给 C 中的 pthread_create 参数对象

passing for loop index into pthread_create argument object in C

我想通过包装器对象将 for 循环的索引传递给 pthread_create 的参数。但是,线程打印的整数不正确。 我希望下面的代码能够打印出来,没有特定的顺序。

id is 0, id is 1, id is 2, id is 3,

但是它会打印这个,并且整数 1,3 永远不会传递到线程中

id is 0, id is 0, id is 0, id is 2,

struct thread_arg {
 int id;
 void * a;
 void * b;
}

void *run(void *arg) {
 struct thread_arg * input = arg;
 int id = input->id;
 printf("id is %d, ", id)
}

int main(int argc, char **argv) {
 for(int i=0; i<4; i++) {
  struct thread_arg arg;
  arg.id = i;
  arg.a = ...
  arg.b = ...
  pthread_create(&thread[i], NULL, &run, &arg);
 }

}

struct thread_arg处于自动存储状态,其作用域只存在于for循环内。此外,内存中只有其中的一个,并且您将相同的一个传递给每个不同的线程。您在修改同一个对象的 ID 4 次不同时间和在您的工作线程中打印出它的 ID 之间创建了数据竞争。此外,一旦 for 循环存在,该内存就超出范围并且不再有效。由于您在此处使用线程,因此调度程序可以随意 运行 您的主线程或您的任何子线程,因此我希望看到有关打印输出的不一致行为。在将其传递给子线程之前,您需要制作一个 struct thread_arg 数组或 malloc 每个数组。

#define NUM_THREADS 4

struct thread_arg {
  int id;
  void * a;
  void * b;
}

void *run(void *arg) {
  struct thread_arg * input = arg;
  int id = input->id;
  printf("id is %d, ", id)
}

int main(int argc, char **argv) {
  struct thread_arg args[NUM_THREADS];
  for(int i=0; i<NUM_THREADS; i++) {
    args[i].id = i;
    args[i].a = ...
    args[i].b = ...
    pthread_create(&thread[i], NULL, &run, &args[i]);
  }

  // probably want to join on threads here waiting on them to finish
  return 0;
}