用于create_pthread()调用的cast成员函数

我想停止警告

server.cpp:823:警告:从’void *(ClientHandler :: )()’转换为’void)(void )’

在电话中:

pthread_create(th, NULL, (void* (*)(void*)) &ClientHandler::handle, (void *) clientHandler); 

其中handle()ClientHandler的成员函数:

 void* ClientHandler::handle(); 

我很难从编译器中解密函数类型的消息。

问题是:

  • 我应该更改handle()接口吗? 我可以摆脱整体铸造吗?
  • 我应该改变演员吗? 到底是什么?
  • 完全不同的东西?

你不能直接这样做,指向成员函数的指针不是函数的简单指针,不能直接交给C回调。

你需要一个级别的间接:

 void callHandle(void *data) { ClientHandle *h = static_cast(data); h->handle(); } pthread_create(th, 0, &callHandle, static_cast(handle)); 

有关更多信息/替代方案,请参阅C ++ FAQ的“ 指向成员的指针”部分。

有关callHandlecallHandle的有效性,请参阅此问题 。 当你调用callHandle时(以及它实际上指向ClientHandle的事实),你自己负责确保handle仍然存活。

您需要将静态cdecl函数传递给此签名中给出的pthread_create

 void* handler(void* data); 

可选参数可用于将ClientHandler对象传递给线程。

 class ClientHandler() { public: static void* handle(void* data); } extern "C" { void* ClientHandler::handle(void* data) { ClientHandler* handler = reinterpret_cast(data) // fancy stuff with handler object here } } /* extern "C" */ 

如果您希望从ClientHandler类的特定实例调用ClientHandler::handle方法,那么遗憾的是它比您的示例更复杂,因为指向成员函数的指针通常与指向函数的指针不同。 有关以这种方式创建pthreads需要执行哪些操作的完整说明,请参见此处 。