错误的方法签名和调用

时间:2018-10-27 15:16:53

标签: c pthreads

所以我有一个应该具有使用者线程和生产者线程的程序。

在main方法中,我要调用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 :(得分:1)

(在我的comment中已经指出,pthread_t中有main()的数组;将它们传递给启动程序,就像将int数组一样。如果您通过int数组,则使启动器函数的签名与您执行的操作匹配。然后使用&array[index]将指针传递到数组的单行pthread_create()。总计:

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数组中的第pthread_t 个条目;传递其地址即可为pthread_create()函数提供预期的pthread_t *