Also wollte ich mich herausfordern, indem ich einen kleinen threadpool in C++ schreibe, und ich wollte versuchen, die einfach zu bedienende Art und Weise, mit der std :: thread arbeiten, zu können Erstelle einen Thread und als Parameter sende eine Funktion und Parameter für diese Funktion, verglichen mit etwas wie pthreads, die dich zwingen, eine void * als einzige Indata für die Funktion zu haben.C++ speichern Funktion und Parameterliste für die spätere Verwendung
Bis jetzt konnte ich Vorlagen und Parameterpakete verwenden, um eine Funktion zu erstellen, die eine andere Funktion und Parameter dafür übernehmen und ausführen kann, aber ich finde keine Möglichkeit, sie zu speichern, so dass ich sie ausführen kann zu einem späteren Zeitpunkt (wenn es einen freien Thread im Threadpool gibt). Ich habe versucht, std :: function zusammen mit std :: tuple und std :: bind zu verwenden, aber da ich nicht genau weiß, mit welchen Typen ich es zu tun habe, kann ich keine Möglichkeit finden, die Funktion und die Parameter zu speichern damit ich sie später in einem anderen Teil meines Codes verwenden kann, da ich an diesem Punkt nicht mehr weiß, aus welchen Typen alles besteht. Unten ist ein Code, mit dem ich herumgespielt habe, der helfen könnte zu zeigen, wie ich meine.
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;
}
Es könnte sein, dass es nicht möglich ist, zu tun, was ich tun möchte, und in diesem Fall denke ich, werde ich nur mehr wie pThreads zu einem Ansatz wechseln. Aber wenn jemand eine Arbeit kennt, wäre ich dankbar.
Haben Sie Lambdas probiert? Es kann Funktionsaufruf und Parameter ohne irgendein Problem speichern. –
@MichaelNastenko Ich habe in sie geschaut, aber das Problem, wie man sie in einem allgemeinen Sinn speichert, gilt auch für sie – Gamewolf3000
Sie können 'std :: packaged_task' in Lambda und es wird kümmern sich um die Speicherung von Parametern und die Rückgabe von Wert. –