-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathAsync_01.cpp
More file actions
123 lines (96 loc) · 3.3 KB
/
Async_01.cpp
File metadata and controls
123 lines (96 loc) · 3.3 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
// ===========================================================================
// Async_01.cpp // std::async
// ===========================================================================
#include "../Logger/Logger.h"
#include <chrono>
#include <future>
#include <iostream>
#include <string>
#include <thread>
namespace SimpleAsync {
static std::string hello(std::string s) {
std::this_thread::sleep_for(std::chrono::seconds{ 3 });
std::string result{ "Hello ASync from " + s + "." };
Logger::log(std::cout, "returning ", result);
return result;
}
class Hello {
public:
std::string operator() (std::string s) const {
std::this_thread::sleep_for(std::chrono::seconds{ 3 });
std::string result{ "Hello ASync from " + s + "." };
Logger::log(std::cout, "returning ", result);
return result;
}
};
auto helloLambda =
[](std::string s) {
std::this_thread::sleep_for(std::chrono::seconds{ 3 });
std::string result{ "Hello ASync from " + s + "." };
Logger::log(std::cout, "returning ", result);
return result;
};
static void test_01() {
Logger::log(std::cout, "Start std::async's:");
// std::async with function
std::future<std::string> futureFunction{
std::async( hello, "function")
};
// std::async with callable object
Hello helloObject{};
std::future<std::string> futureFunctionObject {
std::async(helloObject, "callable object")
};
// std::async with lambda function
std::future<std::string> futureLambda {
std::async(helloLambda, "lambda")
};
auto result1{ futureFunction.get() };
Logger::log(std::cout, "result1: ", result1);
auto result2{ futureFunctionObject.get() };
Logger::log(std::cout, "result2: ", result2);
auto result3{ futureLambda.get() };
Logger::log(std::cout, "result3: ", result3);
}
static void test_02() {
Logger::log(std::cout, "Start std::async:");
auto lambda =
[] () {
std::this_thread::sleep_for(std::chrono::seconds{ 5 });
return 123;
};
std::future<int> future{
std::async(lambda)
};
Logger::log(std::cout, "waiting");
std::future_status status;
do
{
status = future.wait_for(std::chrono::seconds{ 1 });
switch (status)
{
case std::future_status::deferred:
Logger::log(std::cout, "Deferred");
break;
case std::future_status::timeout:
Logger::log(std::cout, "Timeout");
break;
case std::future_status::ready:
Logger::log(std::cout, "Ready");
break;
}
}
while (status != std::future_status::ready);
auto result{ future.get() };
Logger::log(std::cout, "Result: ", result);
}
}
void test_async_01()
{
using namespace SimpleAsync;
test_01();
test_02();
}
// ===========================================================================
// End-of-File
// ===========================================================================