【问题标题】:Dereference struct array in thread function?在线程函数中取消引用结构数组?
【发布时间】:2026-01-06 13:20:03
【问题描述】:

我将指向结构数组的指针传递给线程函数。

pthread_create(&init_thread, NULL, initialize, reservations);

后来,我不知道如何在线程函数中取消引用它。

预订是

struct reservation reservations[20]  

结构数组。

线程函数初始化如下。

void * initialize(void * args) {
  struct reservation *all_reservations[] = (struct reservation *[])args;

  // Wait for semaphore signals
  sem_wait(mutexA);
  sem_wait(mutexB);

  for (int i = 0; i < 20; i++) {
    if (all_reservations[i]) {
      all_reservations[i] = NULL;
    }
  }
  // Signal semaphores for other processes
  sem_signal(mutexA);
  sem_signal(mutexB);

  printf("%s\n","All reservations are initialized.");
}

我收到此错误: 错误:转换为不完整的类型'struct reservation *[]'

【问题讨论】:

    标签: c arrays multithreading struct


    【解决方案1】:

    请记住,数组衰减为指向其第一个元素的指针。

    因此,当您将参数reservations 传递给pthread_create 调用时,它实际上与&amp;reservations[0] 相同,其类型为struct reservation *。您应该在线程函数中使用哪种类型。

    换句话说,在线程函数initialize 中,您没有指针数组,而只是指向结构数组的第一个元素 的普通指针。每个元素的类型都是struct reservation,即不是指针。


    除此之外,我看不到使用线程对reservations 数组进行简单初始化。它的作用(初始化每个结构)必须在任何其他处理完成之前完成,所以它本质上是serial。它必须在其他任何事情之前完成,不需要甚至用于任何类型的并行工作。

    【讨论】:

      【解决方案2】:

      您传递的参数reservations 不是指向数组的指针。它是一个数组,作为函数参数传递,作为指向第一个元素的指针。

      您可以转换并声明为一个简单的指针:

      struct reservation *all_reservations = (struct reservation *)args;
      

      【讨论】:

        最近更新 更多