C程序:将函数作为参数传递给另一个函数来创建线程

时间:2017-11-13 13:15:24

标签: c function pthreads

我需要一些帮助。我已经做了好几个小时而且无法让它工作。通常,我有一个访问内核驱动程序的函数,我想将该函数作为参数传递给另一个包含一些pthread代码的函数。我研究并发现我可能需要一个函数指针。

这是我想要作为参数传递的函数。

static void kernelTest(char Send[BUFFER_LENGTH])
{
    int fd = open("/dev/kernelTest", O_RDWR); 
}

这是我要传递的功能:

static void createKThread(void (*f)(char *))
{
  pthread_t t1;
  int ret;
  ret =  pthread_create(&t1, NULL, (*f)(char), NULL);
  pthread_join(t1, NULL);
}

我尝试了函数指针,但它给了我错误。

 error: expected expression before ‘char’

我非常感谢所提供的任何帮助。谢谢!

1 个答案:

答案 0 :(得分:3)

(*f)(char)语法无效。您似乎正在尝试调用函数f并将char作为参数传递,而您无法做到这一点。

由于您实际上并未真正致电f,因此请直接将其传递给pthread_create

ret =  pthread_create(&t1, NULL, f, NULL);
然而,这仍然存在问题。 pthread_create的第三个参数应为void *(*)(void *)类型,即指向具有void *参数且返回void *的函数的指针。您的函数的类型为void (*)(char *),因此参数不兼容。

您需要更改kernelTest的签名以匹配pthread_create期望的内容:

static void *kernelTest(void *param)
{
    char *send = param;
    int fd = open("/dev/kernelTest", O_RDWR); 
    return NULL;
}

或者你需要创建一个匹配pthread_create的包装函数:

static void *kernelTest_wrapper(void *param)
{
    char *send = param;
    kernelTest(send); 
    return NULL;
}