Hallo,
ich habe mal wieder ein C++-Problem. Ich habe ein Job-System, dem ich beliebige Callables zur Ausführung in diversen Threads übergeben kann. Das sieht in etwa so aus:
Code: Alles auswählen
void Dings::MachParallel( std::function<void()>&& func);
Das funktioniert soweit prima, solange ich normale Lambdas verwende. Nun möchte ich aber eine dicke Ressource in das Lambda hinein moven, also dem Lambda den Ownership übergeben. Innerhalb des Lambdas soll das Objekt dann nochmal in eine Funktion gemoved werden. Etwa so:
Code: Alles auswählen
auto lambda = [zeugs = std::move(dieRessource)]() mutable { MachWasDamit( std::move( zeugs)); };
dings.MachParallel( std::move( lambda));
Das Lambda muss
mutable sein, weil der normale
operator() ja eigentlich
const wäre und ich die Ressource damit nicht weiterverschieben könnte. Das Problem ist nun, dass ich eine Wand aus Compilerfehlern bekomme, die
anscheinend bedeuten, dass
std::function irgendwie mein Lambda kopieren will. Und das geht natürlich nicht, weil mein Ressourcen-Objekt nicht kopierbar, sondern nur movable ist.
Zum Ausprobieren gibt hier Beispielcode:
https://godbolt.org/z/xxDBIW
Die Frage an die Experten in der Runde lautet: was ist die idiomatische Lösung, um teure Ressourcen mit Ownership an einen Threadworker zu übergeben? Danke im Voraus!