所以我想通过用 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 的方法。但如果有人知道解决方法,我将不胜感激。
最佳答案
关键是您可以将 std::bind 的返回类型存储在 std::function 中。因为 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
是一个空函数,如果没有办法将值传递回 API 的使用者,这可能有意义。
关于c++ 存储函数和参数列表以备后用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43483366/