所以我想通过在C ++中编写一个小的线程池来挑战自己,我想尝试模仿std :: thread使用的易用方式,你可以创建一个线程并作为参数发送一个函数和pthreads这样的函数相比,它会强制你将void *作为函数的唯一indata。
到目前为止,我已经能够使用模板和参数包创建一个函数,可以为它执行另一个函数和参数并执行它,但我找不到存储它们的方法,以便我可以执行它们在以后(当线程池中有一个空闲线程时)。我已经尝试将std :: function与std :: tuple和std :: bind一起使用,但由于我不确切知道我正在处理什么类型,因此无法找到存储方法函数和参数,以便我以后可以在我的代码的另一部分使用它们,因为在那时我不再知道一切都是什么类型。下面是我一直在搞乱的一些代码,这可能有助于说明我的意思。
template<typename Function, typename... Arguments>
void TestFunction(Function func, Arguments... parameters)
{
std::function<std::result_of<Function(Arguments...)>::type(Arguments...)>* tempFunc;
tempFunc = new std::function<std::result_of<Function(Arguments...)>::type(Arguments...)>(func);
void* funcPtr = tempFunc;
std::tuple<Arguments...>* tempTuple;
tempTuple = new std::tuple<Arguments...>(parameters...);
void* tuplePtr = tempTuple;
//func(parameters...);
(Arguments...)>*)funcPtr, *(std::tuple<Arguments...>*)tuplePtr);
auto bindTest = std::bind(func, parameters...);
bindTest();
void* bindPtr = &bindTest;
}
int main()
{
TestFunction(std::printf, "%d, %d, %d\n", 3, 2, 1);
getchar();
return 0;
}
可能是因为我不可能做我想做的事情,在这种情况下我想我只需要切换到更像pthreads的方法。但如果有人知道一项工作,我将不胜感激。
答案 0 :(得分:2)
关键是你可以在std :: function中存储std :: bind的返回类型。因为std :: bind返回一个可调用的对象。然后,您应该能够存储std :: function实例,具体取决于您希望如何处理返回类型。
template<typename Function, typename... Arguments>
void TestFunction(Function func, Arguments... parameters)
{
using Ret = typename std::result_of<Function>::type;
std::function<Ret()> val{std::bind(func, parameters...)};
}
如果在第一次重新启动函数时执行此操作,则不再需要考虑参数类型,只需考虑返回类型。如何处理返回类型将取决于存储函数的用例。一个简单的方法是要求Function
是一个void函数,如果没有办法将值传递给API的使用者,这可能是有意义的。