Wie kombinieren Sie die Verwendung von std::bind mit std::shared_ptr
Ich brauche, so etwas zu tun, mehr als oft:
AsyncOperation * pAsyncOperation = new AsyncOperation();
auto bindOperation = std::bind(&AsyncOperation::operator(), std::ref(*pAsyncOperation));
std::thread thread(bindOperation );
thread.join();
mit AsyncOperation
jede benutzerdefinierte Klasse die operator()
(auch bekannt als Funktor oder eine Funktion Objekt).
Ist es möglich anzugeben, um die std::bind
zu verwenden std::shared_ptr
statt einer std::ref
?
Dies würde verhindern, dass Speicher-Lecks, ohne meinen zu müssen, halten eine Referenz auf pAsyncOperation
, und löschen würde die AsyncOperation
automatisch an das Ende des Fadens, das ist das Ende dieses asynchrone Aufgabe.
EDIT: habe ich nicht immer Zugriff auf std::thread, der thread-Bibliothek boost::thread oder sogar eine andere Plattform angewiesen threads. Und durch die Konsequenz, nicht den Zugang zu std::async.
Mein Hauptproblem ist es, eine Vorstellung von Besitz in der std::bind.
- Haben Sie versucht, zu verwenden
std::shared_ptr
? Sieht kompiliert ohne Probleme: liveworkspace.org/code/1e83d9698703711b7ed2ce0d44cf86f2 - Was Sie wissen müssen ist, dass
std::bind
stores gebunden Argumente per Wert (d.h., "bestanden"), daher, wenn Sie eine besitzen Zeiger durch Wert als einer der parameter, die Zeiger erhält "kopiert" werden in die resultierende Funktor, also holding Besitz, auch nachdem die ursprünglicheshared_ptr
geht out of scope.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies funktioniert:
Finden Sie unter: http://liveworkspace.org/code/4bc81bb6c31ba7b2bdeb79ea0e02bb89
make_shared
oder wirdstd::shared_ptr<AsyncOperation> pAsyncOperation( new AsyncOperation() );
tun?Brauchen Sie
AsyncOperation
werden dynamisch zugewiesen? Wenn nicht, würde ich das tun:ansonsten:
Können Sie natürlich auch
std::thread
, aber es kann mehr Probleme (d.h. die Ausnahmebehandlung im anderen thread).std::bind
hat auch seine eigenen Probleme, und Sie werden wahrscheinlich besser am Ende mit einem lambda.Wenn Sie wirklich brauchen, um passieren eine eigentumsrechtliche anderen thread auch:
als Lambda-Ausdrücke nicht unterstützt verschieben Typ fängt doch.
Ich hoffe, das hilft.