본문 바로가기
다양한 TIP

c++ async 프로그래밍 예제(비동기 예제)

by 유기농프로그래밍 2023. 7. 12.
반응형

Async란?

"async"는 "비동기"를 의미하는 용어입니다. "async"는 "asynchronous"의 약어로, 동기적인 작업 흐름과 달리 비동기적인 작업 흐름을 의미합니다.

 

동기적인 작업은 순차적으로 진행되며, 한 작업이 끝나야 다음 작업을 수행할 수 있습니다. 작업이 완료될 때까지 다른 작업을 기다려야 하는 특징이 있습니다. 이에 비해 비동기적인 작업은 작업을 시작한 후, 완료를 기다리지 않고 다른 작업을 수행할 수 있습니다. 비동기적인 작업은 백그라운드에서 동시에 실행되며, 작업이 완료되면 그 결과를 반환하거나 콜백 함수를 호출하여 결과를 처리합니다.


비동기 작업은 주로 네트워크 요청, 파일 입출력, 데이터베이스 액세스와 같이 시간이 오래 걸리는 작업을 수행할 때 유용합니다. 동기적인 작업은 작업이 완료될 때까지 다른 작업을 수행할 수 없기 때문에, 긴 작업이 완료될 때까지 프로그램이 블로킹되는 현상이 발생할 수 있습니다. 이러한 문제를 해결하기 위해 비동기 작업을 사용하여 프로그램의 응답성과 성능을 향상시킬 수 있습니다.

 

C++ 프로그램 예제

C++에서 비동기적으로 동작하려면 일반적으로 비동기 작업을 처리하는 스레드를 생성하거나 비동기 작업을 처리하는 라이브러리를 사용해야 합니다. 

 

C++에는 여러 가지 비동기 처리 방법이 있지만, C++11부터 도입된 std::async와 std::future를 사용하여 비동기 작업을 처리하는 방법을 설명하겠습니다.

 

아래의 예시 코드에서는 std::async와 std::future를 사용하여 비동기적으로 작업을 수행하는 방법을 보여줍니다:

 

Sample.cpp 코드

아래는 sample.cpp 입니다.

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

// 비동기 작업을 수행하는 함수
std::string performAsyncTask()
{
    std::cout << "Async task doing" << std::endl;
    return "Async task result";
}

int main()
{
    // 비동기 작업 시작
    std::future<std::string> futureResult = std::async(std::launch::async, performAsyncTask);

    // 메인 스레드에서 다른 작업 수행
    std::cout << "Performing other tasks..." << std::endl;

    // 비동기 작업 결과 대기 및 출력
    std::string result = futureResult.get();
    std::cout << "Async task result: " << result << std::endl;

    return 0;
}

performAsyncTask() 함수에 아래 내용을 더해주면 더 확실한 비동기 테스트를 할 수 있습니다.

2초 뒤에 더 추가한 task든 cout이든 동작할 것입니다.

std::this_thread::sleep_for(std::chrono::seconds(2)); // 비동기 작업 시뮬레이션

 

컴파일 방법

 

컴파일 방법은 c++ 11을 기반으로 pthread를 추가해야합니다.

 

컴파일 예제

g++ -std=c++11 -o output test.cpp -lpthread

standard c++11이라는 의미와 pthread library를 사용한다는 의미로 g++ 컴파일러를 사용했습니다.

 

이제 실행을 해보면 아래와 같이 나옵니다.

 

./output
Performing other tasks...
Async task doing
Async task result: Async task result

간단한 예제 프로그램이니 이걸 기반으로 더 좋은 async 프로그램을 만들어봅시다.

반응형

댓글