fork () vs std :: async in C ++
Ich bin neu in den Konzepten von Asyc und Fork. Bisher habe ich verstanden, dass fork () Chid-Prozesse erstellt, die asynchron ausgeführt werden. Und der std :: async erstellt einen Thread aus dem Systempool und startet ihn hier asynchron, wenn ich std :: launch :: async erwähne .
Wie unterscheidet sich beispielsweise der folgende Codesatz? 1: Verwenden von std :: async
std::vector<std::future<void>> result;
for(i=0;i<5;i++){
result. push_back(std::async(std::launch::asyc, foo, var1));
}
for( auto e : result)
e.get();
2. Mit der Gabel ()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
Angenommen, der Rückgabetyp der foo-Funktion ist ungültig und die Argumente werden als Referenz oder Zeiger übergeben.
Antworten
Der Hauptunterschied besteht darin, dass im Fall von std::asyncdie beiden Ausführungsthreads einen Prozess gemeinsam nutzen. Im Fall von forkhaben sie jeweils ihren eigenen Prozess.
Dieser Unterschied wirkt sich am stärksten auf Dinge aus, die sich nach dem Anruf ändern. Im Fall von forkkann jeder Prozess dann seine eigenen Dateideskriptoren öffnen und schließen, seinen eigenen Speicherplatz verwalten und so weiter. Im Fall von std::asyncteilen sich die Threads weiterhin Dateideskriptoren, Speicherplatz usw.
fork()
fork()Erstellt einen untergeordneten Prozess durch Duplizieren des aufrufenden Prozesses. Der untergeordnete Prozess ist vom übergeordneten Prozess getrennt, sodass jeder seinen eigenen Speicher hat. Ohne die Einrichtung von Kommunikationskanälen zwischen Prozessen ist es unmöglich, Daten zwischen den beiden Prozessen zu übertragen. Der häufigste Anwendungsfall für Aufrufe fork()ist das Starten eines Prozesses als Hintergrunddienst (auch bekannt als "Daemon"). Wenn Sie beispielsweise Ihren bevorzugten Webserver über die Befehlszeile starten, wird möglicherweise ein untergeordneter Prozess (der eigentliche Serverprozess) abgeschaltet. Sobald dies erledigt ist, endet der Hauptprozess, sodass die Kontrolle zu Ihrer Shell zurückkehrt und Sie andere Dinge tun können.
std::async
std::asyncführt eine Funktion in einem separaten Thread aus (unter der Annahme einer Richtlinie std::launch::async). Es gibt ein zurück, std::futurebei dem Sie aufrufen können get(), um den von der Funktion zurückgegebenen Wert abzurufen (vorausgesetzt, es wurde zurückgegeben und keine Ausnahme ausgelöst). Der get()Aufruf wird sofort zurückgegeben, wenn die Funktion in der Zwischenzeit abgeschlossen wurde. Andernfalls wird er blockiert, bis die Funktion zurückgegeben wurde. Diese Funktion ist std::asyncein nützliches Werkzeug, um teure Berechnungen im Hintergrund auszuführen und gleichzeitig etwas anderes zu tun.