C++/Thread (Async)
![[Async] std::packaged_task](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FwVB7e%2FbtrJFPHZka5%2FAAAAAAAAAAAAAAAAAAAAAEKWixAkigNuS0vEMs84GhXfJtUSwhRL2YDPwzvZ5ln7%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DRvGCUNR81rKhgaZegHpIqKRPIf0%253D)
[Async] std::packaged_task
std::packaged_task callable object를 wrap하는 템플릿 클래스이다. 즉, 람다함수나 기존의 함수 혹은 callable object를 비동기적으로 부를 수 있게 해주는 wrapper라고 생각하면 된다. 예를 들어, 비동기 함수 처리에는 std::async를 사용하거나 future,promise 쌍으로 다른 thread에 할당시키는 방법이 있었다. 그런데 packaged_task를 사용하면 비동기적으로 호출할 수 있는 오브젝트를 만들었기 때문에 std::async 보다는 우리가 원하는 컨트롤 할 수 있을 뿐 아니라 쉽게 코드를 만들 수 있다. Example Code #include #include #include #include int add1(int n) { return n +..
![[Async] std::async](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FxcJAQ%2FbtrJC5KX72u%2FAAAAAAAAAAAAAAAAAAAAAMoipAqH_zvWrzO8PvfNj0s0y7hZMwskzQ-YCIvT6Jv8%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3D7E%252Bsq1HGHrAFNLT4d3M71wsENvA%253D)
[Async] std::async
std::async std:::async는 C++에서 비동기호출을 매우 쉽게 만들어준다. 이전에 promise와 future를 통한 커뮤니케이션 채널을 통해 비동기 함수를 구현할 수 있었다. 하지만 그 인터페이스를 보면 코드를 만들어가는 과정이 직관적이지 않다. 그래서 이러한 관계를 추상화시켜서 비동기 함수 호출을 더 쉽게 직관적으로 만들 수 있다. 간단한 코드부터 보자. Example Code : future, promise 컨셉 #include #include #include #include #include void add1(std::promise prms, int n) { prms.set_value(n+1); } int main() { int num = 42; std::promise prms; st..
![[Async] shared_future](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FIHSnw%2FbtrJFP8oS7e%2FAAAAAAAAAAAAAAAAAAAAAMsBRLIGVOJ52xaoXN9FCor-wkKrdaIPw0KkAXDvOUr_%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3Dz4BRI2jqB5wZiDr8ZeWH7wK2j4s%253D)
[Async] shared_future
shared_future future와 promise는 1:1 매칭이 되어야하기 때문에 복사가 불가능하다. 하지만 promise를 통해 하나의 value가 set이 되면 이를 여러 곳에서 읽어야 하는 경우가 있을 수 있다. 여러 future에서 value를 읽어야하는 경우 Copy가 가능한 것이 shared_future이다. Example Code : shared_future 사용 #include #include #include #include #include void fn(std::shared_future fut) { std::cout
![[Async] Future, Promise](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FIBtWU%2FbtrJvQGa0qx%2FAAAAAAAAAAAAAAAAAAAAAOmfuodVwv39_W-nFGoqR5oAqTxIiRFUmCFzXbksj87X%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3DNSM8GIuuV9fm5na1i%252F%252FtvXuu8y8%253D)
[Async] Future, Promise
Future, Promise future와 promise는 커뮤니케이션 채널을 만드는 하나의 쌍이다. 이 채널을 통해 전달할 수 있는 신호는 Data, Exception, Signal 그리고 각 promise와 future는 다른 thread에 있어도 되고 같은 thread에서 커뮤니케이션을 해도 된다. 간단하게 코드부터 확인해보자. Single Thread 예제 Example Code #include #include #include int main() { // 데이터를 넣을 수 있는 promise 생성 std::promise prms; // promise와 한 쌍이될 수 있는 future를 get_future함수를 통해 생성 std::future fut = prms.get_future(); // set..
![[Async] 비동기 함수 Introduction](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FbjPSzW%2FbtrJvQsCZ4Q%2FAAAAAAAAAAAAAAAAAAAAAIqvJPY53uKPYKOobkF9Xwd0wK0_EFgLrQtzB_CuSIKm%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1753973999%26allow_ip%3D%26allow_referer%3D%26signature%3D14di%252BClgrD6bpU7E0xLwhk50Hnw%253D)
[Async] 비동기 함수 Introduction
비동기 함수, std::async 이전에 thread, mutex, condition_variable과 같은 저수준의 Concurrency 프로그래밍을 배웠다. 하지만 이를 많이 사용하면 코드가 복잡해지고 가독성이 떨어지는 것도 사실이다. 그래서 C++에서는 더 high level의 concurrency 기능을 제공하고 있지만 좋지 못한 성능 때문에 덜 사용되고 있다. 그래도 성능보다 가독성, 생산성이 필요한 곳에서는 사용할 수 있기 때문에 알아두는 것이 좋다. 비동기 함수란 간단하게 설명하자면 어떤 Task가 Main thread에서 처리가 되길 기다리는 것이 아니라 비동기적으로 다른 곳에서 실행하고 Main thread는 Task의 완료된 결과값이 필요할 때만 가져다 사용하는 것이다. Main thr..