我正在尝试传递此函数:void* checkMatrix();
作为此函数的参数:void createThreads(void*(*f));
。
我在这里读了一篇文章,所以我的上述文章就是这样的结果。
我正在调用这样的函数:createThreads(checkMatrix);
但是它给了我一个类型不兼容的警告[void **和void *()]。我可以快速投射,但不会解决问题。
最后我写了这样的函数(简单初始化):
void createThreads(void* (*f)) {
pthread_t* a;
int i;
a = (pthread_t*) malloc(*arr.l * sizeof(pthread_t));
if (a == NULL) {
fprintf(stderr, "ERROR!\n");
exit(1);
}
for (i = 0; i < *arr.l; i++) {
if (pthread_create((a + i), NULL, (void*) &f, NULL)) {
fprintf(stderr, "ERROR IN THREAD CREATION!\n");
exit(2);
}
}
for (i = 0; i < *arr.l; i++)
pthread_join(*(a + i), NULL);
}
总之,问题在于它因内存问题而停止,但原因是线程的创建,特别是在我指定线程将要处理的函数的第3个参数中。我觉得我在打电话时做错了。我找不到答案,也无法绕过它。
谢谢你的时间!
答案 0 :(得分:2)
void* (*f)
只是void **f
,带有一组冗余括号。您可能希望将此用作参数类型:
void* (*f)()
然而,不是 pthread_create
期望的内容。线程的主要功能应该返回void*
并获取void*
参数。所以你真正想要的可能就是:
void createThreads(void* (*f)(void*)) {
/* ... as before ... */
if (pthread_create((a + i), NULL, f, NULL)) {
/* ... as before ... */
}
答案 1 :(得分:2)
以void* checkMatrix();
开头是过时的样式,不应使用。其次,pthread回调函数将void*
作为参数。所以请改用void* checkMatrix(void*);
。
要将其传递给某个功能,只需执行
即可void createThreads (void* (*f)(void*))
使用函数指针时的推荐做法是使用typedef,以提高可读性。例如,你可以做点像
typedef void* pthread_callback (void*);
void createThreads (pthread_callback* f)
答案 2 :(得分:1)
尝试将功能签名更改为void createThreads(void* (*f)(void *))
并将pthread_create函数调用更改为pthread_create((a + i), NULL, f, NULL)