请考虑以下代码示例:
如您所见,有一个类具有一个模板
不幸的是,我现在被要求使用给定的线程库(这是不可协商的)将此函数作为线程运行。线程库的入口函数必须是具有以下签名的
我该如何做呢?
#include <functional>
#include <iostream>
template <typename... Ts>
class SomeClass
{
public:
std::function<bool(Ts...)> some_func;
void run(Ts... args)
{
this->some_func(args...); // this works
this->thread_run((void *)&this->some_func, args); // this won't work, can't pass the parameter pack
}
static void thread_run(void *func_ptr, void *args_ptr)
{
auto thread_func = *(std::function<bool(Ts...)> *)(func_ptr);
thread_func(2, 3);
}
};
int main()
{
SomeClass<int, int> a;
a.some_func = [](int x, int y)
{ std::cout << "Arguments: " << x << " " << y << std::endl; return x > y; };
a.run(2, 3);
return 0;
}
如您所见,有一个类具有一个模板
std::function
成员变量。我可以通过给它一个lambda表达式来设置它,该表达式必须返回bool
,但可以具有任意数量的参数,这很好!不幸的是,我现在被要求使用给定的线程库(这是不可协商的)将此函数作为线程运行。线程库的入口函数必须是具有以下签名的
static
函数:
void (*thread_entry_t)(void *p1, void *p2)
我已经成功将std::function
变量传递给示例中的static
函数,请参见thread_run()
函数,但我找不到通过void*
指针将参数包args
传递给static
函数的方法。我该如何做呢?
std::tuple
? - undefinedp1
、p2
是什么,是谁提供的? - undefinedstd::jthread
来进行多线程编程吗?我猜你是想使用一些特定于平台的线程库。为什么不尝试使用std
版本呢? - undefined