fork () 대 C ++의 std :: async

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();

2nd : 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별도의 스레드 에서 함수를 실행합니다 (policy이라고 가정 std::launch::async). 그것은 반환 std::future당신이 호출 할 수있는 get()값을 얻을 수는 (그것을 반환 및 예외가 발생하지 않은 가정) 함수에 의해 반환. get()함수가 반환 될 때까지 함수가, 그 사이에, 그렇지 않으면 블록을 완료하면 호출은 즉시 반환합니다. 이 기능은 std::async다른 작업을 수행하면서 백그라운드에서 값 비싼 계산을 실행하는 데 유용한 도구입니다.