-
Notifications
You must be signed in to change notification settings - Fork 1
/
try_main.cpp
165 lines (117 loc) · 3.24 KB
/
try_main.cpp
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
155
156
157
158
159
160
#include "NonBlockJob.h"
#include <stdio.h>
#include <iostream>
#include <string.h>
// ________________________________TRY MAIN____________________________________________
int parseLineForThreadCount(char* line)
{
// This assumes that a digit will be found and the line ends in " Kb".
int i = strlen(line);
const char* p = line;
while (*p <'0' || *p > '9') p++;
i = atoi(p);
return i;
}
bool GetThreadsStatus(int& threadsCount, int& maxPossibleThreads){
FILE* file = fopen("/proc/self/status", "r");
char line[128];
bool returnValue = false;
if (file){
while (fgets(line, 128, file) != NULL){
if (strncmp(line, "Threads:", 8) == 0){
threadsCount = parseLineForThreadCount(line);
FILE* fileMaxThreads = fopen("/proc/sys/kernel/threads-max", "r");
if(fileMaxThreads){
if( fgets(line, 128, fileMaxThreads) != NULL){
maxPossibleThreads = atoi(line);
}
fclose(fileMaxThreads);
}
returnValue = true;
break;
}
}
fclose(file);
}
else {
printf("Failed to get thread statistics: %s",strerror(errno));
}
return returnValue;
}
class Dor {
public:
int d_read(char* data) {
printf("before read\n");
// if (read(0,data,128) < 0) { // o is STDIN
// printf("read faild\n");
// return false;
// }
std::cin >> data;
printf("after read :)\n");
return 5;
}
private:
};
class Ran {
public:
Ran(Dor* dorWrapper) {
m_dorWrapper = dorWrapper;
}
~Ran() {
}
void Act(char* data) {
// try {
// /*auto fut = */NonBlockJob::getInstance().try_run_for(2000, [this, &data](){
// m_dorWrapper->d_read(data);
// });
// // std::cout << "fut: " << fut.get() << std::endl;
// // if the thread didn't set yet the promise value, main thread will wait here
// }
// catch (const std::exception& e) {
// std::cout << "Ran catch : " << e.what() << std::endl;
// }
int threadsCount = 0, maxThreads = 0;
constexpr int NUM_OF_THREADS = 4;
std::array<std::thread, NUM_OF_THREADS> threads;
for (int i = 0; i < NUM_OF_THREADS; ++i) {
threads[i] = std::thread([=]() {
try {
/*auto fut = */NonBlockJob::getInstance().try_run_for(6000, [this, &data](){
m_dorWrapper->d_read(data);
});
// std::cout << "fut: " << fut.get() << std::endl;
// if the thread didn't set yet the promise value, main thread will wait here
}
catch (const std::exception& e) {
std::cout << "Ran catch : " << e.what() << std::endl;
}
printf("\n");
});
std::this_thread::sleep_for(std::chrono::seconds(1));
if( GetThreadsStatus(threadsCount,maxThreads) ){
std::cout << "Number of threads in process [" << threadsCount << "/" << maxThreads << "]\n";
}
printf("\n");
}
//wait for all
for (auto& t : threads) {
t.join();
if( GetThreadsStatus(threadsCount,maxThreads) ){
std::cout << "Number of threads in process [" << threadsCount << "/" << maxThreads << "]\n";
}
printf("\n");
}
}
private:
Dor* m_dorWrapper;
};
int main(int argc, char *argv[])
{
char data[128] = {0};
Dor* ldor = new Dor();
Ran ran(ldor);
ran.Act(data);
printf("echo : [%s]\n" , data);
delete ldor;
return 0;
}