pthread_join неверный тип аргумента - PullRequest
0 голосов
/ 28 октября 2019

Я пытался создать простой поток, который читает из стандартного ввода и сохраняет входные данные в связанный список. При создании и присоединении к потоку я получаю следующую ошибку:

warning: passing argument 1 of ‘pthread_join’ makes integer from pointer without a cast [-Wint-conversion]
   pthread_join(prod_thread, NULL);

Я передаю аргумент thread_t * в pthread_join, но кажется, что он ожидает int, который меня смущает. Кто-нибудь может объяснить, почему это происходит? Вот код:

pair_t* head = malloc(sizeof(pair_t));
pthread_t* prod_thread = malloc(sizeof(pthread_t));
pthread_create(prod_thread, NULL, prod_func, head);
pthread_join(prod_thread, NULL);

Функция prod_func выглядит следующим образом:

void* prod_func(void* head) {
  ...
}

Я также пытался вызвать pthread_join(&prod_thread, NULL);, но затем я получаю ту же ошибку.

1 Ответ

2 голосов
/ 28 октября 2019

Я передаю аргумент thread_t * в pthread_join, но кажется, что он ожидает int, который меня смущает.

pthread_join ожидает, что его первый аргумент будет pthread_t (не pthread_t *). Точный тип pthread_t в действительности зависит от реализации, но в вашей реализации это целочисленный тип. Вместо этого вы передаете указатель.

Я также пытался вызвать pthread_join (& prod_thread, NULL);но тогда я получаю ту же ошибку.

Конечно, вы делаете. если prod_thread имеет тип pthread_t *, то его адрес &prod_thread имеет тип pthread_t **. Это идет в неправильном направлении (и результат по-прежнему указатель). Поскольку вы написали свои декларации, то, что вы на самом деле хотите, это

pthread_join(*prod_thread, NULL);
...