CodeNote
Coding Note
CodeNote
전체 방문자
오늘
어제
  • 전체 보기 (35)
    • C++ (33)
      • Modern C++ (12)
      • Modern C++ STL (0)
      • Thread (16)
      • Thread (Async) (5)
    • 디자인패턴 (0)
    • Algorithm (2)
    • Electron (0)
    • Python (0)

블로그 메뉴

  • 홈
  • Github
  • 태그
  • 방명록

공지사항

인기 글

태그

  • C++
  • 자료구조
  • mutex
  • C++ #Memory
  • LOCK
  • Free

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
CodeNote

Coding Note

[Async] 비동기 함수 Introduction
C++/Thread (Async)

[Async] 비동기 함수 Introduction

2022. 8. 10. 22:41

비동기 함수, std::async

이전에 thread, mutex, condition_variable과 같은 저수준의 Concurrency 프로그래밍을 배웠다. 하지만 이를 많이 사용하면 코드가 복잡해지고 가독성이 떨어지는 것도 사실이다. 그래서 C++에서는 더 high level의 concurrency 기능을 제공하고 있지만 좋지 못한 성능 때문에 덜 사용되고 있다. 그래도 성능보다 가독성, 생산성이 필요한  곳에서는 사용할 수 있기 때문에 알아두는 것이 좋다.

 

비동기 함수란 간단하게 설명하자면 어떤 Task가 Main thread에서 처리가 되길 기다리는 것이 아니라 비동기적으로 다른 곳에서 실행하고 Main thread는 Task의 완료된 결과값이 필요할 때만 가져다 사용하는 것이다.

 

Main thread에서 바로 필요하지도 않은 결과를 오랫동안 기다리는 것은 비효율적이다. 이를 Main thread가 아닌 다른 thread가 진행하게하고 Main thread는 자기 할일은 한 후에 다른 thread가 계산한 Task의 결과값을 가져다가 쓰기만 하면 더 효율적인 프로그램이 될 것이다.

 

C++에서 제공하는 컨셉은 Task 기반의 비동기함수인데 thread, mutex, contion_variable, shared_variable를 컨트롤 하는 것이 아니라  주어진 함수를 Task로 보고 알아서 처리되도록 추상화를 시킨다. 그럼 개발자는 아주 쉽게 추상화된 라이브러리를 통해 비동기적으로 Task를 처리할 수 있는 것이다. 그리고 이를 C++에서는 Promise와 Future를 통해 구현하고 있다.

Example Code : 간단한 예제

#include <iostream>
#include <chrono>
#include <future>

int fn()
{
   std::cout << "async fn" << std::endl;
   return 42;
}

int main()
{
    // async로 실행된 결과값을 future에 보관한다.
    std::future<int> fut = std::async(std::launch::async, fn); // launch policy를 넘겨줘야한다.
	// get함수를 통해 결과값을 받아온다.
    const int num = fut.get(); 
    // 만약 이 때 future 안에 결과값이 준비가 되지 않다면 
    // Main Thread는 fut.get()함수에서 wait 상태가 되었다가 결과값이
    // 들어오면 wait 상태가 해제되고 자신의 일을 계속 진행한다.
    
    std::cout << "return num : " << num << std::endl;
    return 0;
}

출력 결과

만약 위와 같은 메커니즘을 thread, mutex, condition variable을 통해 구현한다면 코드가 훨씬 복잡해질 것이다.

 

'C++ > Thread (Async)' 카테고리의 다른 글

[Async] std::packaged_task  (0) 2022.08.14
[Async] std::async  (0) 2022.08.14
[Async] shared_future  (0) 2022.08.11
[Async] Future, Promise  (0) 2022.08.10
    'C++/Thread (Async)' 카테고리의 다른 글
    • [Async] std::packaged_task
    • [Async] std::async
    • [Async] shared_future
    • [Async] Future, Promise
    CodeNote
    CodeNote
    기록 블로그

    티스토리툴바