fork () vs std :: async w C ++

Sep 01 2020

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

2 DavidSchwartz Sep 01 2020 at 05:28

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.

MartinKonrad Sep 01 2020 at 09:20

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.