这是一个说明我的问题的最小例子
test.c的:
#include <stdio.h>
#include <pthread.h>
#define CORES 8
pthread_t threads [ CORES ];
int threadRet [ CORES ];
void foo ()
{
printf ("BlahBlahBlah\n" );
}
void distribute ( void ( *f )() )
{
int i;
for ( i = 0; i < CORES; i++ )
{
threadRet [ i ] = pthread_create ( &threads [ i ], NULL, f, NULL );
}
for ( i = 0; i < CORES; i++ )
{
pthread_join ( threads [ i ], NULL );
}
}
int main ()
{
distribute ( &foo );
return 0;
}
Vim / gcc输出:
test.c:20|11| warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
/usr/include/pthread.h:225|12| note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)()’
我需要添加/删除*
/ &
以将foo
传递给distribute
然后将其传递给某个帖子?
答案 0 :(得分:5)
void *foo (void *x)
{
printf ("BlahBlahBlah\n" );
}
void distribute ( void * (*f)(void *) ) {
/* code */
}
应该做的伎俩
因为原型是:
extern int pthread_create (pthread_t *__restrict __newthread,
__const pthread_attr_t *__restrict __attr,
void *(*__start_routine) (void *),
void *__restrict __arg) __THROW __nonnull ((1, 3));
答案 1 :(得分:3)
建议的最低更改是:
void *foo(void *unused)
{
printf("BlahBlahBlah\n");
return 0;
}
void distribute(void *(*f)(void *))
{
...as before...
}
pthread_create()
函数想要一个指向函数的指针,该函数接受void *
参数并返回void *
结果(尽管你还没有得到那个错误)。因此,通过将foo()
放入一个带有void *
参数并返回void *
结果的函数,将指针传递给该函数类型。并且,对于它的价值,您几乎可以肯定将foo()
变成静态函数,因为您不太可能直接从该文件外部调用它。
答案 2 :(得分:0)
这个页面似乎很好地解释了它:http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=%2Fapis%2Fusers_14.htm;
IBM文档通常非常好,当它们出现时,请关注那些ibm链接;)。
所以,显然你需要一个函数指针在其参数中取一个void指针。试试
void distribute ( void *( *f )(void *) ) {...}
您可能还需要更改foo的定义。有关函数指针,请参阅以下教程:http://www.cprogramming.com/tutorial/function-pointers.html。注意:我自己没有测试过,所以不能保证它是否会起作用 - 但我希望它至少能指向正确的方向;)。