我在C中有一个函数:
void start_fun()
{
// do something
}
我想使用pthread_create()
创建一个线程,启动例程为start_fun()
,不修改void start_fun()
,如何将函数指针指向start_fun()
;
答案 0 :(得分:6)
如果在代码中的任何地方编写函数名start_fun
而没有任何参数,则会得到一个指向该函数的函数指针。
但是 pthread_create需要格式为void* func (void*)
的函数。
如果不能重写函数,则必须编写包装器:
void* call_start_fun (void* dummy)
{
(void)dummy;
start_fun();
return 0;
}
然后将call_start_fun传递给pthread_create:
pthread_create(&thread, NULL, call_start_fun, NULL);
答案 1 :(得分:3)
用作表达式的函数名称计算指向指定函数的指针。因此,例如:
pthread_t thread_id;
int result = pthread_create(&thread_id, NULL, start_fun, NULL);
HOWEVER ,您提供的启动函数没有正确的签名,因此使用作为 pthread启动函数会产生未定义的行为。 start函数必须具有以下签名:
void *start_fun(void *arg);
该函数可以忽略它的参数并且总是返回NULL
,如果合适,但必须使用参数和返回值(这些类型)声明它。