Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cast member function for create_pthread() call

I want to stop the warning

server.cpp:823: warning: converting from 'void* (ClientHandler::)()' to 'void ()(void)'

in the call:

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

where handle() is a member function of ClientHandler:

void* ClientHandler::handle();

I have difficulties deciphering the function-type message from the compiler.

The question is:

  • Should I change the handle() interface? Can I get rid of casting overall?
  • Should I change the cast? To what exactly?
  • Something completely different?
like image 999
towi Avatar asked Apr 10 '26 04:04

towi


1 Answers

You can't do that directly, pointers to member functions are not plain pointers to functions and can't be handed over to C callbacks directly.

You'll need one level of indirection:

void callHandle(void *data) {
  ClientHandle *h = static_cast<ClientHandle*>(data);
  h->handle();
}

pthread_create(th, 0, &callHandle, static_cast<void*>(handle));

See the Pointers to members section of the C++FAQ for more information / alternatives.

For the validity of the cast in callHandle, see this question. You are sole responsible for making sure that handle is still alive and well when callHandle is called of course (and for the fact that it actually points to a ClientHandle).

like image 99
Mat Avatar answered Apr 11 '26 19:04

Mat



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!