неверная подпись метода и вызов - PullRequest
0 голосов
/ 27 октября 2018

Итак, у меня есть программа, которая должна иметь потоки потребителя и производителя.

В основном методе я хочу вызвать init_consumers(), который вызовет ptread_init()

Вотнекоторый код:

int init_consumers(char *quantity, pthread_t **cons, void *complex_obj)
{
    //seting the limit acording to "quantity"
    for (; i < limit; i++)
        pthread_create(cons[i], NULL, &consumer, &complex_obj);

    return(i);
}

main:

#include <pthread.h>
#define MAX_PROD 50
#define MAX_CONS 50
///main entry point of the program
int main(int argc, char *argv[])
{
    pthread_t prod[MAX_PROD];
    pthread_t cons[MAX_CONS];
    struct complex_obj *co;

    //some code

    co = create_cplx_obj();
    //complex object manipulation code

    init_producers(argv[2], &prod, co);
    init_consumers(argv[3], &cons, co);

    //more code

    exit(0);
}

argv[2] и argv[3] - сколько производителей / потребителей хочет пользователь.

Такжеподпись потока: void *producer(void *args);
У меня все еще возникают проблемы с * и &, поэтому моя проблема заключается в выполнении вызова метода и подписи.

Ошибка, которую я получал, была

n_prod_n_cons.c:158:6: note: expected ‘pthread_t * {aka long unsigned int *}’ but argument is of type ‘pthread_t (*)[50] {aka long unsigned int (*)[50]}’  int init_producers(char *quantity, pthread_t *prod, void *complex_obj)

1 Ответ

0 голосов
/ 27 октября 2018

Как указано (кратко) в моем комментарии , у вас есть массивы pthread_t в main(); передать их в пусковые установки так же, как вы бы массив int. Сделайте так, чтобы сигнатура функций запуска соответствовала тому, что вы сделали бы, если бы передали массив int. Затем используйте &array[index], чтобы передать указатель на одну строку массива на pthread_create(). Это в сумме составляет:

In main():

init_producers(argv[2], prod, co);
init_consumers(argv[3], cons, co);

(Ваш код передавал pthread_t (*)[MAX_PROD] - указатель на массив фиксированного размера pthread_t - на функции запуска, весьма отличающийся от сигнатур, ожидающих pthread_t **.)

Пусковые установки выглядят так:

int init_consumers(char *quantity, pthread_t *cons, void *complex_obj)
{
    // setting the limit acording to "quantity"
    for (; i < limit; i++)
        pthread_create(&cons[i], NULL, consumer, &complex_obj);

    return(i);
}

cons[i] - это запись i th в массиве pthread_t; передача его адреса дает функции pthread_create() ожидаемую pthread_t *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...