【问题标题】:cannot convert from type void* (class name)(void*) to type void* (*)(void*) in a pthread无法在 pthread 中从类型 void* (类名)(void*) 转换为类型 void* (*)(void*)
【发布时间】:2016-09-08 13:05:17
【问题描述】:

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

在 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*)

【问题讨论】:

  • 非静态成员函数不能用作简单的线程函数。您需要一个静态成员函数或非成员函数。哦,当然,无论你使用什么函数,它实际上都需要一个 void* 参数。或者你当然可以顺应时代潮流,开始使用std::thread
  • 如果你有 C++11 或更高版本,我建议你使用库提供的std::thread,这样你就不必为void*s 搞砸了。
  • @NathanOliver 或在 C++11 之前使用 boost::thread

标签: c++ pthreads type-conversion


【解决方案1】:

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,这样也可以轻松使用成员函数。

【讨论】:

  • 折叠起来:内联比 cmets 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 2023-03-16
  • 1970-01-01
  • 2022-01-06
  • 2016-12-24
  • 1970-01-01
相关资源
最近更新 更多