我正在尝试在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*)
答案 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
,它也可以轻松使用成员函数。