我将指向结构数组的指针传递给线程函数。
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;
答案 0 :(得分:2)
请记住,数组会衰减到指向第一个元素的指针。
因此,当您将参数reservations
传递给pthread_create
来电时,它实际上与&reservations[0]
相同,而struct reservation *
类型为initialize
。你应该在线程函数中使用哪种类型。
换句话说,在线程函数struct reservation
中,您没有指针数组,而只是指向结构数组的第一个元素的普通指针。每个元素都是reservations
类型,即不是指针。
除此之外,我没有看到使用线程来简单地初始化{{1}}数组。它的作用(初始化每个结构)必须在完成任何其他处理之前完成,因此它本身就是串行。 必须在其他任何事情之前完成,不需要甚至用于任何类型的并行工作。
答案 1 :(得分:1)
您传递的参数reservations
不是指向数组的指针。它是一个数组,作为函数参数传递,作为指向第一个元素的指针。
您可以转换并声明为简单指针:
struct reservation *all_reservations = (struct reservation *)args;