(C++ : Concurrency) 4. async

Posted by : at

Category : Cpp


  • 비동기 : 순차적으로 실행되진 않는다.
    • 입출력(I/O) 작업(네트워크 작업)
    • 내부적으로 복잡한 연산을 작업
  • 멀티쓰레드 : 동시에 여러작업이 가능하다.

  • C++에서 쓰레드 만들기
    • std::thread
    • std::jthread (C++20)
    • std::async

#include <iostream>
#include <thread>
#include <chrono>
#include <future>
using namespace std::literals;

int add(int a, int b)
{
    std::this_thread::sleep_for(2s);
    return a+b;
}

int main()
{
    // add(10, 20);                                   // 동기
    std::future<int> ft = std::async(add, 10, 20);    // 비동기

    int ret = ft.get();
    std::cout << "result : " << ret << std::endl;
}
#include <iostream>
#include <thread>
#include <chrono>
#include <future>
using namespace std::literals;

int add(int a, int b)
{
    std::cout << "add : " << std::this_thread::get_id() << std::endl;
    std::this_thread::sleep_for(2s);
    return a+b;
}

int main()
{
    // std::launch::async : 비동기로 만들어 주세요
    std::future<int> ft = std::async(std::launch::async, add, 10, 20);

    // std::launch::deferred : 지연된 실행으로 만들어 주세요(get에서 실행해 주세요)
    std::future<int> ft = std::async(std::launch::deferred, add, 10, 20);

    // std::launch::async | std::launch::deferred : 비동기 지연된 실행으로 해주세요
    std::future<int> ft = std::async(std::launch::async | std::launch::deferred, add, 10, 20);

    // 환경에 따라 달라진다(대부분은 지연된 실행에 비동기)
    std::future<int> ft = std::async(add, 10, 20);

    std::cout << "continue main : " << std::this_thread::get_id() << std::endl;
    std::this_thread::sleep_for(2s);
    int ret = ft.get();
    std::cout << "result : " << ret << std::endl;
}
#include <iostream>
#include <thread>
#include <chrono>
#include <future>
using namespace std::literals;

int add(int a, int b)
{
    std::cout << "start add" << std::endl;
    std::this_thread::sleep_for(2s);
    std::cout << "finish add" << std::endl;
    return a+b;
}

int main()
{
    std::future<int> ft = std::async(std::launch::async, add, 10, 20);

    std::cout << "continue main" << std::endl;

    // int ret = ft.get();
    // get을 호출안한다면
    // add는 호출이 되지 않을까??
    // Nope! -> future의 소멸자에서 get이 자동호출되어 add가 호출되게 된다.
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links