fork () vs std :: async w C ++
Jestem nowy w koncepcjach asyc i fork, do tej pory rozumiałem, że fork () tworzy procesy chid, które będą działać asynchronicznie. A std :: async utworzy wątek z puli systemowej i uruchomi go asynchronicznie tutaj, jeśli wspomnę o std :: launch :: async .
Na przykład, czym różni się poniższy zestaw kodu? 1: używając 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();
2nd: Korzystanie z widelca ()
for(i=0;i<5;i++){
if(fork()==0){
foo(var1);
exit(0);
}
}
Załóżmy, że zwracanym typem funkcji foo jest void, a argumenty są przekazywane jako referencje lub wskaźniki.
Odpowiedzi
Kluczowa różnica polega na tym, że w przypadku programu std::asyncdwa wątki wykonania współdzielą proces. W przypadku forkkażdego z nich ma swój własny proces.
Ta różnica w największym stopniu wpływa na rzeczy, które zmieniają się po rozmowie telefonicznej. W przypadku forkkażdego procesu można następnie otwierać i zamykać własne deskryptory plików, zarządzać własną przestrzenią pamięci i tak dalej. W przypadku std::asyncwątków nadal współużytkują deskryptory plików, przestrzeń pamięci i tak dalej.
fork()
fork()tworzy proces potomny , powielając proces wywołujący. Proces potomny jest odłączony od procesu nadrzędnego, więc każdy ma własną pamięć i bez ustanowienia jakichkolwiek kanałów komunikacji między procesami niemożliwe jest przekazywanie danych między dwoma procesami. Najczęstszym przypadkiem użycia wywołania fork()jest uruchomienie procesu jako usługi w tle (inaczej „demon”). Na przykład, kiedy uruchamiasz swój ulubiony serwer WWW w wierszu poleceń, może on oddzielić proces potomny (rzeczywisty proces serwera). Gdy to zrobisz, główny proces się kończy, więc sterowanie wraca z powrotem do powłoki i możesz robić inne rzeczy.
std::async
std::asyncwykonuje funkcję w oddzielnym wątku (przy założeniu polityki std::launch::async). Zwraca a, std::futurena którym można wywołać get()wartość zwróconą przez funkcję (zakładając, że zwróciła i nie zgłosiła wyjątku). get()Wywołanie zwraca natychmiast, jeśli funkcja zakończyła się w międzyczasie, w przeciwnym razie bloki aż powróciła funkcja. Ta funkcja jest std::asyncużytecznym narzędziem do wykonywania kosztownych obliczeń w tle podczas wykonywania innych czynności.