所以我有一个应该具有使用者线程和生产者线程的程序。
在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)
答案 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 *
。