본문 바로가기
프로그래밍언어/C++

[C++] std::async 비동기, 정책 (std::launch::async, std::launch::deferred)

by 연어바케트 2022. 4. 12.
반응형

References


std::async 

  •  함수만 전달하면 Thread를 알아서 만들어서 함수를 비동기적으로 실행하고 std::future을 return 한다. 
  • async에 어떠한 방식으로 수행될 것인지 정책을 전달 할 수 있다. 
    • std::launch::async
       - 바로 쓰레드를 생성해서 인자로 전달도니 함수를 실행한다.(비동기적 수행) 
    • std::launch::deferred
       - future의 get 함수가 호출되었을 때 실행한다. (새로운 쓰레드를 생성하지 않음.) (동기적 수행)
    •  policy를 설정하지 않으면 어느 정책이 실행되는지 알수 없음 

Policy별 수행.

#include <iostream>
#include <future>
#include <thread>
#include <chrono>
#include <string>

void Excute(std::string str)
{
    std::cout << "lanuch::async start " << str << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));
    std::cout << "lanuch::async end " << str << std::endl;
}


int main()
{
    auto asy = std::async(std::launch::async, Excute, "async");
    auto def = std::async(std::launch::deferred, Excute, "deferred");
}

 

결과화면

  get이 없기 때문에 deferred가 수행되지 않음을 알 수 있다. 

 

def.get() 추가 실행

int main()
{
    auto asy = std::async(std::launch::async, Excute, "async");
    auto def = std::async(std::launch::deferred, Excute, "deferred");
    def.get();
}

 

결과화면

  get() 호출이 되어야 def 가 실행된것을 볼수 있다. 


 

std::thread 스레드 기반 비동기적 실행

 -> 스레드를 통해 어떤 일을 겪게 될지 알수 없음. 병렬처리로 어떤 값을 받게될지 알 수 없음.

 

std::async 작업 기반 비동기적 실행

 -> 미래에 어떤 값을 받아낼 것인가에 더 관심. 병렬 처리 간에 값을 주고 받기가 쉬움. 스레드의 결과를 리턴으로 받는다.

반응형

댓글