2018년 11월 14일 수요일

std::promise, std::future, std::async

std::promise와 std::future를 활용해서 스레드가 진행되면서 나오는 값을 반환받을 수 있다.

c++11 에서는 async를 활용하면 더 간단하게 코드 구성이 가능하지만..

std::promise 와 std::future를 사용해 본 간단한 코드..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cstring>
#include <future>
#include <Windows.h> // for Sleep
 
void ThreadFunc(std::promise<int>& retVal, int value)
{
    Sleep(value);
 
    retVal.set_value(value);
}
 
int main(void)
{
    // 여기서 promise 타입으로 스레드로 반환받을 형태의 template으로 선언해준다.
    std::promise<int> p1, p2;
 
    // 아래의 auto는 std::future<std::int> 이다.
    auto f1 = p1.get_future();
    auto f2 = p2.get_future();
 
    // 스레드 만들어서 호출해주고, 스레드에 인자로 위에서 선언한 것을 넣어준다.
    // std::ref(p)로 해줘도 되고, &p 해줘도 되고..
    std::thread th1(ThreadFunc, std::ref(p1), 20000);
    std::thread th2(ThreadFunc, std::ref(p2), 1000);
 
 
    // 스레드 작업이 끝날 때까지 대기함.
    // th2 작업이 먼저 끝나지만, th1.join()으로 대기하게 됨.
    // th1 작업이 끝나서 블록해제되면 그제서야 th2.join()으로 스레드 종료된거 확인하고 값 가져옴
    th1.join();
    th2.join();
 
    std::cout << f1.get() << std::endl;
    std::cout << f2.get() << std::endl;
 
    return 0;
}
cs


std::async 를 활용하면 요렇게 하면 된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstring>
#include <future>
#include <Windows.h> // for Sleep
 
int ThreadFunc(int value)
{
    Sleep(value);
    return value;
}
 
int main(void)
{
    std::future<int> f1 = std::async(ThreadFunc, 20000);
    std::future<int> f2 = std::async(ThreadFunc, 1000);
    
    std::cout << f1.get() << std::endl;
    std::cout << f2.get() << std::endl;
 
    return 0;
}
cs

댓글 없음:

댓글 쓰기

A*, JPS 길찾기 알고리즘 시뮬레이션 사이트

https://qiao.github.io/PathFinding.js/visual/ 길 찾기 알고리즘 시행 과정을 보여주는 사이트다. 링크 메모..