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 |
댓글 없음:
댓글 쓰기