线程函数中的解引用结构数组?

时间:2017-11-02 20:33:38

标签: c arrays multithreading struct

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

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

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

预订是

struct reservation reservations[20]  

一个struct数组。

线程函数初始化如下。

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.");
}

我收到此错误: 错误:转换为不完整类型&#39; struct reservation * []&#39;

2 个答案:

答案 0 :(得分:2)

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

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

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

除此之外,我没有看到使用线程来简单地初始化{{1}}数组。它的作用(初始化每个结构)必须在完成任何其他处理之前完成,因此它本身就是串行必须在其他任何事情之前完成,不需要甚至用于任何类型的并行工作。

答案 1 :(得分:1)

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

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

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