pthread_create来自非静态成员函数

时间:2010-03-14 05:01:15

标签: c++ pthreads

这有点类似于:pthread function from a class

但是最后调用的函数是引用this指针,所以不能使它成为静态的。

void * Server::processRequest()
{
     std::string tmp_request, outRequest;
     tmp_request = this->readData();
     outRequest = this->parse(tmp_request);
     this->writeReply(outRequest);
}

void * LaunchMemberFunction(void * obj)
{
    return ((Server *)obj)->processRequest();
}

然后是pthread_create

Server SServer(soc);

pthread_create(&handler[tcount], &attr, (void*)LaunchMemberFunction,(void*)&SServer);

错误:

SS_Twitter.cpp:819:错误:从void *无效转换为void *()(void ) SS_Twitter.cpp:819:错误:初始化int pthread_create的参数3(pthread_t *,const pthread_attr_t *,void *()(void ),void *)

4 个答案:

答案 0 :(得分:2)

您正在将第三个参数转换为void* ((void*),然后收到错误,因为void*无法转换为函数指针。

我相信如果你只使用&LaunchMemberFunction,它应该编译。

答案 1 :(得分:0)

摆脱LaunchMemberFunction前面的(void *)。它既不必要又不正确,以及错误的原因。该语言不会隐式地从void *转换为指向函数类型的指针,这是您编写的代码所需要的。 pthread_create的那个参数已经是正确的类型,没有理由将它转换为其他类型。

答案 2 :(得分:0)

在您定义的函数中,我看不到输入参数类型,请使用以下

void * Server::processRequest(void)
{
     std::string tmp_request, outRequest;
     tmp_request = this->readData();
     outRequest = this->parse(tmp_request);
     this->writeReply(outRequest);
}

第二件事,您不必只使用一个函数指针,如下所示

pthread_create(&handler[tcount], &attr, &LaunchMemberFunction,(void*)&SServer);

答案 3 :(得分:-1)

问题出在演员身上。您正在将函数指针强制转换为无法隐式转换为void*的{​​{1}} - 这是void (*)(void*)为第三个参数接受的类型。

您不需要将参数转换为确切类型,但如果必须,则为:

pthread_create