I want to use the pthreads library in C with C lambdas. My lambdas are of the type std::function<void(X)>
when X can be any type such as int
, double
, float
or a custom type. Moreover, it is possible that the lambda accepts more than one parameter. For example, I can have a lambda of the type std::function<void(float,int)>
. Now I want to cast this lambda to a C style function pointer which takes in a single void*
arguments and returns a void*
type. So I want to cast my lambda to a function pointer of the type void* (*)(void*)
.
I want to do this so that I can pass this function pointer to the pthread_create API. Can someone please tell me how can I do this?
I think that since the target type accepts a void*
argument, I'll need to create a wrapper function of the type void* my_wrapper(void*)
which would call the lambda inside its body. Then I think I should be able to pass a pointer to the wrapper to the pthreads API.
Moreover, I will also need a way to capture the lambda arguments so that I can wrap them up in a custom structure whose pointer I can then pass to the wrapper.
CodePudding user response:
Start by creating a lambda, callable without parameters and returning void *
. Presumably it'd call your std::function
with an appropriate parameter.
auto lambda = [&]() -> void *
{
std::cout << "Hello, world!\n";
return nullptr;
};
Then create another lambda:
auto caller = [](void *data) -> void *
{
return (*static_cast<decltype(lambda) *>(data))();
};
caller(&lambda)
calls lambda()
.
Now you can pass caller
to pthread_create
, with &lambda
as the argument.