所以我想通過在C++中編寫一個小線程池來挑戰自己,並且我試圖模仿std :: thread使用的簡單易用的方法,您可以創建一個線程,並作爲參數發送一個函數和該函數的參數,相比之下像pthreads這迫使你有一個void *作爲函數的唯一indata。C++存儲函數和參數列表供以後使用
到目前爲止,我已經能夠使用模板和參數包來創建一個函數,它可以接受另一個函數和參數並執行它,但是我找不到一種方法來存儲它們以便我可以執行它們在稍後的時間(當線程池中有空閒線程時)。我已經嘗試使用std ::函數一起使用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;
}
這可能是它不可能做我想做的事,而在這種情況下,我想我就必須切換到更像是並行線程的方法。但如果有人知道一個工作,我會很感激。
你試過lambdas嗎?它可以存儲函數調用和參數沒有任何問題。 –
@MichaelNastenko我已經看過他們,但如何將它們存儲在一般意義上的問題也適用於它們 – Gamewolf3000
您可以在lambda中使用'std :: packaged_task',它將負責存儲參數並返回值。 –