-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathSimpleThreading_02.cpp
More file actions
154 lines (114 loc) · 3.96 KB
/
SimpleThreading_02.cpp
File metadata and controls
154 lines (114 loc) · 3.96 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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// ===========================================================================
// Simple Threading Demo (4 ways to create threads) // SimpleThreading_02.cpp
// ===========================================================================
#include <iostream>
#include <thread>
#include <chrono>
#include "../Logger/Logger.h"
/*
* 4 ways to create a thread:
*
* a) Thread with Function Pointer
* b) Thread with Callable Object
* c) Thread with Lambda
* d) Thread with Member Function
*/
namespace SimpleThreading02 {
constexpr size_t NumIterations{ 5 };
static void function(int value, size_t iterations) {
for (size_t i{}; i != iterations; ++i) {
Logger::log(std::cout, "in thread ", value);
std::this_thread::sleep_for(std::chrono::seconds{ 1 });
}
Logger::log(std::cout, "Done.");
}
static void test_01() {
std::thread t{ function, 1, NumIterations };
t.join();
Logger::log(std::cout, "Done Version 1.");
}
// --------------------------------------------
class Runnable {
private:
int m_value;
size_t m_iterations;
public:
Runnable (int value, size_t iterations)
: m_value{ value }, m_iterations{iterations } {}
void operator () () const {
for (size_t i{}; i != m_iterations; ++i) {
Logger::log(std::cout, "in thread ", m_value);
std::this_thread::sleep_for(std::chrono::seconds{ 1 });
}
Logger::log(std::cout, "Done.");
}
};
static void test_02() {
std::thread t { Runnable { 2, NumIterations } };
t.join();
Logger::log(std::cout, "Done Version 2.");
}
// --------------------------------------------
static void test_03() {
int value{ 3 };
size_t iterations{ NumIterations };
std::thread t {
[=] () {
for (size_t i{}; i != iterations; ++i) {
Logger::log(std::cout, "in thread ", value);
std::this_thread::sleep_for(std::chrono::seconds{ 1 });
}
Logger::log(std::cout, "Done.");
}
};
t.join();
Logger::log(std::cout, "Done Version 3.");
}
// --------------------------------------------
class AnotherRunnable {
private:
int m_value;
size_t m_iterations;
public:
AnotherRunnable(int value, size_t iterations)
: m_value{ value }, m_iterations{ iterations } {}
void run() const {
for (size_t i{}; i != m_iterations; ++i) {
Logger::log(std::cout, "in thread ", m_value);
std::this_thread::sleep_for(std::chrono::seconds{ 1 });
}
Logger::log(std::cout, "Done.");
}
};
static void test_04() {
AnotherRunnable runnable{ 4, NumIterations };
std::thread t { &AnotherRunnable::run, &runnable };
t.join();
Logger::log(std::cout, "Done Version 4.");
}
// --------------------------------------------
// Hints for Error Handling:
static void test_05() {
AnotherRunnable runnable{ 5, NumIterations };
std::thread t1{ &AnotherRunnable::run, runnable }; // works
std::thread t2{ &AnotherRunnable::run, std::move(runnable) }; // works too
AnotherRunnable* pRunnable = new AnotherRunnable{ 5, NumIterations }; // delete is missing
std::thread t3{ &AnotherRunnable::run, pRunnable }; // works again too
t1.detach();
t2.detach();
t3.detach();
Logger::log(std::cout, "Done Version 5.");
}
}
void test_simple_threading_02()
{
using namespace SimpleThreading02;
test_01();
test_02();
test_03();
test_04();
test_05();
}
// ===========================================================================
// End-of-File
// ===========================================================================