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

Sep 01 2020

Je suis nouveau dans les concepts d'asyc et de fork, ce que j'ai compris jusqu'à présent, c'est que le fork () crée des processus chid qui fonctionneront de manière asynchrone. Et le std :: async créera un thread à partir du pool système et le lancera de manière asynchrone ici si je mentionne std :: launch :: async .

Par exemple, en quoi l'ensemble de code ci-dessous diffère-t-il? 1: utilisation de 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ème: Utilisation de fork ()

for(i=0;i<5;i++){ 
    if(fork()==0){
        foo(var1);
        exit(0);
    }
}

Supposons que le type de retour de la fonction foo est void et que les arguments sont passés en tant que référence ou pointeurs.

Réponses

2 DavidSchwartz Sep 01 2020 at 05:28

La principale différence est que dans le cas de std::async, les deux threads d'exécution partagent un processus. Dans le cas de fork, ils ont chacun leur propre processus.

Cette différence affecte le plus significativement les choses qui changent après l'appel. Dans le cas de fork, chaque processus peut alors ouvrir et fermer ses propres descripteurs de fichiers, gérer son propre espace mémoire, etc. Dans le cas de std::async, les threads continuent à partager des descripteurs de fichiers, de l'espace mémoire, etc.

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()crée un processus enfant en dupliquant le processus appelant. Le processus enfant est détaché du processus parent afin que chacun ait sa propre mémoire et sans configurer de canaux de communication inter-processus, il est impossible de transmettre des données entre les deux processus. Le cas d'utilisation le plus courant pour appeler fork()est de démarrer un processus en tant que service d'arrière-plan (alias "démon"). Par exemple, lorsque vous démarrez votre serveur Web préféré sur la ligne de commande, il peut déclencher un processus enfant (le processus serveur réel). Une fois que cela est fait, le processus principal se termine, donc le contrôle revient à votre shell et vous pouvez faire d'autres choses.

std::async

std::asyncexécute une fonction dans un thread séparé (en supposant une politique std::launch::async). Il renvoie un std::futuresur lequel vous pouvez appeler get()pour obtenir la valeur retournée par la fonction (en supposant qu'elle a renvoyé et n'a pas levé d'exception). L' get()appel retourne immédiatement si la fonction est terminée entre-temps, sinon il se bloque jusqu'à ce que la fonction soit retournée. Cette fonctionnalité constitue std::asyncun outil utile pour exécuter des calculs coûteux en arrière-plan tout en faisant autre chose.