传入 pthread_create 的结构数据在读取时不正确

Struct data passed into pthread_create is incorrect when read

在下面的代码中,我试图将一个结构传递给 pthread_create。该结构是全局定义的。然后在调用 pthread_create.

之前对其进行初始化
// Global scope
struct dat_struct {
  char *dat[SIZE];
  int received[SIZE];
  int numreceived;
};

 // main
  struct dat_struct *data = malloc(sizeof(struct dat_struct));


  for (int i=0; i < nthreads; i++) {
    for (int j=0; j < SIZE; j++) {
      data->received[j] = SIZE;
    }
    data->numreceived = 0;
    pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);
  }

void *thread_handler(void *dat) {
  struct dat_struct *data = (struct dat*)dat;
  // If I read data->numreceived it returns a large negative or
  // something incorrect
  ...
  ...

thread_handler中,读取数据给出了错误的结果。如果我使用 gdb 检查传递到 pthread_create 的内容,它与另一端收到的内容不同。

我的代码中是否存在基本问题?

给定

struct dat_struct *data

这个代码

pthread_create(&thread_ids[i], NULL, thread_handler, (void*)&data);

struct dat_struct ** 作为 void * 传递给线程。注意双 **.

因此这是错误的:

void *thread_handler(void *dat) {
  struct dat_struct *data = (struct dat*)dat;

该代码将 dat 视为 struct dat_struct * - 但您传递了 struct dat_struct **。 (我假设 (struct dat*) 是一个印刷错误)。

您应该使用

创建线程
pthread_create(&thread_ids[i], NULL, thread_handler, data);

void *thread_handler(void *dat) {
  struct dat_struct *data = dat;

注意在C中不需要强制转换to/fromvoid *