不能从类型void *(类名)(void *)转换为在pthread中键入void *(*)(void *)

时间:2016-09-08 13:05:18

标签: c++ pthreads type-conversion

我正在尝试在main函数中创建一个线程,并通过我的线程调用另一个类的函数。

在main.cpp中:

SocketHandler *callserver;
pthread_t thread1;
pthread_create(&thread1,0, callserver->createSocket,NULL);

并在SocketHandler.h中:

void* createSocket();

并在SocketHandler.cpp中:

void * SocketHandler::createSocket()
{
    //....
}

当我尝试编译main.cpp时,我收到错误

 cannot convert SocketHandler::createSocket from type void* (SocketHandler::)() to type void* ( * )(void*)

1 个答案:

答案 0 :(得分:3)

pthread_create()只接受常规函数或类函数的指针,而不接受成员函数的指针。那个指针必须是void *(*)(void *)。要解决此问题,您可以执行下一步:

void *trampoline(void *arg) {
    SocketHandler *callServer = static_cast<SocketHandler *>(arg);
    callServer->createSocket();
    return nullptr;
}

// ...
SocketHandler *callserver;
pthread_t thread1;
pthread_create(&thread1,0, trampoline, callserver);

trampoline()可能会被内联:

pthread_create(&thread1, 0, [](void* ptr){static_cast<SocketHandler*>(ptr)->createSocket(); return (void*)nullptr;}, callserver);

或者你可以使用std::thread,它也可以轻松使用成员函数。