无法正确地将结构传递给 pthread_create 的函数

Can't pass in struct into function for pthread_create correctly

我试图将 Professor 结构传递到我的 professor 函数中,但我无法正确获取存储在其中的信息以传递到该函数中。我怀疑这与我 malloc'd p 的方式有关,但我认为完成后释放会解决该问题。当我尝试打印 *professor->id 时出现段错误,因为显然它决定将 p 读取为内存位置 0x0,即使它不在 main

typedef struct{
    int *id;
    int *assignings;
    int *min_wait;
    int *max_wait;
    int *min_assignments;
    int *max_assignments;
    int *min_hrs;
    int *max_hrs;
} Professor;

Professor* makeProfessor(){
    Professor *professor = malloc(sizeof *professor);
    return professor;
}

void * professorFunc(void *p){
    Professor *professor = (Professor*)p;
    fprintf(stdout,"Starting Professor %d\n", *professor->id);
    pthread_exit(0);
}

int main(int argc, char **argv){
//Creating threads
    pthread_t professor[num_professors];
    Professor *p;
    int i;
    int id;
    for(i = 0; i < num_professors; ++i){
            id = i + 1;
            p = malloc (sizeof *p);
            p->id = &id;
            if(pthread_create(&professor[i], NULL, professorFunc, (void*)p) != 0){
                    perror("pthread_create");
                    exit(1);
            }
            free(p);
    }
    for(i = 0; i < num_professors; ++i){
            if(pthread_join(professor[i], NULL) != 0){
                    perror("pthread_join");
                    exit(1);
            }
    }

您正在分配 Professor 结构数组,并立即释放它们,很可能在您的线程有机会操作它们之前。一个更好的实现方法是分配整个数组,处理它们,然后释放内存,一旦你知道线程已经退出(下面的例子)。

pthread_t professor[num_professors];
Professor *p;
int i;
int id;
p = malloc (sizeof(*p) * num_professors);
for(i = 0; i < num_professors; ++i){
        id = i + 1;
        p->id = &id;
        if(pthread_create(&professor[i], NULL, professorFunc, (void*)p) != 0){
                perror("pthread_create");
                exit(1);
        }
}
for(i = 0; i < num_professors; ++i){
        if(pthread_join(professor[i], NULL) != 0){
                perror("pthread_join");
                exit(1);
        }
}
free(p);