fork () против std :: async в C ++

Sep 01 2020

Я новичок в концепциях asyc и fork, до сих пор я понимал, что fork () создает процессы chid, которые будут выполняться асинхронно. И std :: async создаст поток из системного пула и запустит его здесь асинхронно, если я упомяну std :: launch :: async .

Например, чем отличается приведенный ниже код? 1: использование 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-й: Использование fork ()

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

Предположим, что тип возвращаемого значения функции foo имеет значение void, а аргументы передаются как ссылка или указатели.

Ответы

2 DavidSchwartz Sep 01 2020 at 05:28

Ключевое различие состоит в том, что в этом случае std::asyncдва потока выполнения совместно используют процесс. В случае fork, у каждого из них есть свой собственный процесс.

Эта разница наиболее существенно влияет на то, что меняется после звонка. В случае fork, каждый процесс может затем открывать и закрывать свои собственные файловые дескрипторы, управлять своим собственным пространством памяти и так далее. В случае std::async, потоки продолжают совместно использовать дескрипторы файлов, пространство памяти и так далее.

MartinKonrad Sep 01 2020 at 09:20

fork()

fork()создает дочерний процесс , дублируя вызывающий процесс. Дочерний процесс отделяется от родительского процесса, поэтому каждый имеет свою собственную память, и без настройки каких-либо каналов связи между процессами невозможно передавать данные между двумя процессами. Наиболее распространенный вариант использования вызова fork()- запуск процесса в качестве фоновой службы (также известной как «демон»). Например, когда вы запускаете свой любимый веб-сервер из командной строки, он может отключать дочерний процесс (фактический серверный процесс). Как только это будет сделано, основной процесс завершится, поэтому управление вернется в вашу оболочку, и вы сможете делать другие вещи.

std::async

std::asyncвыполняет функцию в отдельном потоке (при условии соблюдения политики std::launch::async). Он возвращает объект, std::futureкоторый можно вызвать, get()чтобы получить значение, возвращаемое функцией (при условии, что оно вернулось и не сгенерировало исключение). get()Вызов немедленно возвращается , если функция завершена в то же время, в противном случае он блокирует , пока функция не вернулась. Эта функция представляет std::asyncсобой полезный инструмент для выполнения дорогостоящих вычислений в фоновом режиме при выполнении других задач.