#include <stdio.h> #include <future> #include <array> #include <atomic> #include <vector> struct Worker { virtual ~Worker() { } virtual void Init() = 0; virtual void Work() = 0; }; struct BasicWorker : public Worker { virtual ~BasicWorker() { } virtual void Init() { printf("\t\t\t\tInit: %d\n", std::this_thread::get_id()); } virtual void Work() { printf("\t\t\t\tWork: %d\n", std::this_thread::get_id()); } }; struct GroupWorker : public Worker { GroupWorker() { workers.push_back(std::make_shared<BasicWorker>()); } virtual ~GroupWorker() { } virtual void Init() { for(int i = 0; i < workers.size(); ++i) { workers[i]->Init(); } initEvent.notify_all(); } virtual void Work() { for(int i = 0; i < workers.size(); ++i) { workers[i]->Work(); } } void WaitForInit() { //std::unique_lock<std::mutex> initLock(initMutex); //initEvent.wait(initLock); } private: std::mutex initMutex; std::condition_variable initEvent; std::vector<std::shared_ptr<Worker>> workers; }; struct Handler { static const int Stopped = -1; static const int Ready = 0; static const int Running = 1; Handler(const std::shared_ptr<Worker>& worker) : worker(worker) { } void Start(int count) { int readyValue = Ready; if(working.compare_exchange_strong(readyValue, Running)) { worker->Init(); for(int i = 0; i < count && working == Running; ++i) { worker->Work(); } } } void Stop() { working = Stopped; } private: std::atomic<int> working; std::shared_ptr<Worker> worker; }; std::future<void> Start(int jobIndex, int runCount) { //printf("Start: %d\n", jobIndex); return std::async([=]() { printf("Async: %d\n", jobIndex); auto worker = std::make_shared<GroupWorker>(); auto handler = std::make_shared<Handler>(worker); auto result = std::async([=]() { printf("Nested async: %d\n", jobIndex); handler->Start(runCount); }); worker->WaitForInit(); handler->Stop(); result.get(); }); } int main() { const int JobCount = 300; const int RunCount = 5; std::array<std::future<void>, JobCount> jobs; for(int i = 0; i < JobCount; ++i) { jobs[i] = Start(i, RunCount); } for(int i = 0; i < JobCount; ++i) { jobs[i].get(); } }
Standard input is empty
Async: 0 Nested async: 0 Async: 1 Nested async: 1 Async: 2 Nested async: 2 Async: 3 Nested async: 3 Async: 4 Nested async: 4 Async: 5 Nested async: 5 Async: 6 Nested async: 6 Async: 7 Nested async: 7 Async: 8 Nested async: 8 Async: 9 Nested async: 9 Async: 10 Nested async: 10 Async: 11 Nested async: 11 Async: 12 Nested async: 12 Async: 13 Nested async: 13 Async: 14 Nested async: 14 Async: 15 Nested async: 15 Async: 16 Nested async: 16 Async: 17 Nested async: 17 Async: 18 Nested async: 18 Async: 19 Nested async: 19 Async: 20 Nested async: 20 Async: 21 Nested async: 21 Async: 22 Nested async: 22 Async: 23 Nested async: 23 Async: 24 Nested async: 24 Async: 25 Nested async: 25 Async: 26 Nested async: 26 Async: 27 Nested async: 27 Async: 28 Nested async: 28 Async: 29 Nested async: 29 Async: 30 Nested async: 30 Async: 31 Nested async: 31 Async: 32 Nested async: 32 Async: 33 Nested async: 33 Async: 34 Nested async: 34 Async: 35 Nested async: 35 Async: 36 Nested async: 36 Async: 37 Nested async: 37 Async: 38 Nested async: 38 Async: 39 Nested async: 39 Async: 40 Nested async: 40 Async: 41 Nested async: 41 Async: 42 Nested async: 42 Async: 43 Nested async: 43 Async: 44 Nested async: 44 Async: 45 Nested async: 45 Async: 46 Nested async: 46 Async: 47 Nested async: 47 Async: 48 Nested async: 48 Async: 49 Nested async: 49 Async: 50 Nested async: 50 Async: 51 Nested async: 51 Async: 52 Nested async: 52 Async: 53 Nested async: 53 Async: 54 Nested async: 54 Async: 55 Nested async: 55 Async: 56 Nested async: 56 Async: 57 Nested async: 57 Async: 58 Nested async: 58 Async: 59 Nested async: 59 Async: 60 Nested async: 60 Async: 61 Nested async: 61 Async: 62 Nested async: 62 Async: 63 Nested async: 63 Async: 64 Nested async: 64 Async: 65 Nested async: 65 Async: 66 Nested async: 66 Async: 67 Nested async: 67 Async: 68 Nested async: 68 Async: 69 Nested async: 69 Async: 70 Nested async: 70 Async: 71 Nested async: 71 Async: 72 Nested async: 72 Async: 73 Nested async: 73 Async: 74 Nested async: 74 Async: 75 Nested async: 75 Async: 76 Nested async: 76 Async: 77 Nested async: 77 Async: 78 Nested async: 78 Async: 79 Nested async: 79 Async: 80 Nested async: 80 Async: 81 Nested async: 81 Async: 82 Nested async: 82 Async: 83 Nested async: 83 Async: 84 Nested async: 84 Async: 85 Nested async: 85 Async: 86 Nested async: 86 Async: 87 Nested async: 87 Async: 88 Nested async: 88 Async: 89 Nested async: 89 Async: 90 Nested async: 90 Async: 91 Nested async: 91 Async: 92 Nested async: 92 Async: 93 Nested async: 93 Async: 94 Nested async: 94 Async: 95 Nested async: 95 Async: 96 Nested async: 96 Async: 97 Nested async: 97 Async: 98 Nested async: 98 Async: 99 Nested async: 99 Async: 100 Nested async: 100 Async: 101 Nested async: 101 Async: 102 Nested async: 102 Async: 103 Nested async: 103 Async: 104 Nested async: 104 Async: 105 Nested async: 105 Async: 106 Nested async: 106 Async: 107 Nested async: 107 Async: 108 Nested async: 108 Async: 109 Nested async: 109 Async: 110 Nested async: 110 Async: 111 Nested async: 111 Async: 112 Nested async: 112 Async: 113 Nested async: 113 Async: 114 Nested async: 114 Async: 115 Nested async: 115 Async: 116 Nested async: 116 Async: 117 Nested async: 117 Async: 118 Nested async: 118 Async: 119 Nested async: 119 Async: 120 Nested async: 120 Async: 121 Nested async: 121 Async: 122 Nested async: 122 Async: 123 Nested async: 123 Async: 124 Nested async: 124 Async: 125 Nested async: 125 Async: 126 Nested async: 126 Async: 127 Nested async: 127 Async: 128 Nested async: 128 Async: 129 Nested async: 129 Async: 130 Nested async: 130 Async: 131 Nested async: 131 Async: 132 Nested async: 132 Async: 133 Nested async: 133 Async: 134 Nested async: 134 Async: 135 Nested async: 135 Async: 136 Nested async: 136 Async: 137 Nested async: 137 Async: 138 Nested async: 138 Async: 139 Nested async: 139 Async: 140 Nested async: 140 Async: 141 Nested async: 141 Async: 142 Nested async: 142 Async: 143 Nested async: 143 Async: 144 Nested async: 144 Async: 145 Nested async: 145 Async: 146 Nested async: 146 Async: 147 Nested async: 147 Async: 148 Nested async: 148 Async: 149 Nested async: 149 Async: 150 Nested async: 150 Async: 151 Nested async: 151 Async: 152 Nested async: 152 Async: 153 Nested async: 153 Async: 154 Nested async: 154 Async: 155 Nested async: 155 Async: 156 Nested async: 156 Async: 157 Nested async: 157 Async: 158 Nested async: 158 Async: 159 Nested async: 159 Async: 160 Nested async: 160 Async: 161 Nested async: 161 Async: 162 Nested async: 162 Async: 163 Nested async: 163 Async: 164 Nested async: 164 Async: 165 Nested async: 165 Async: 166 Nested async: 166 Async: 167 Nested async: 167 Async: 168 Nested async: 168 Async: 169 Nested async: 169 Async: 170 Nested async: 170 Async: 171 Nested async: 171 Async: 172 Nested async: 172 Async: 173 Nested async: 173 Async: 174 Nested async: 174 Async: 175 Nested async: 175 Async: 176 Nested async: 176 Async: 177 Nested async: 177 Async: 178 Nested async: 178 Async: 179 Nested async: 179 Async: 180 Nested async: 180 Async: 181 Nested async: 181 Async: 182 Nested async: 182 Async: 183 Nested async: 183 Async: 184 Nested async: 184 Async: 185 Nested async: 185 Async: 186 Nested async: 186 Async: 187 Nested async: 187 Async: 188 Nested async: 188 Async: 189 Nested async: 189 Async: 190 Nested async: 190 Async: 191 Nested async: 191 Async: 192 Nested async: 192 Async: 193 Nested async: 193 Async: 194 Nested async: 194 Async: 195 Nested async: 195 Async: 196 Nested async: 196 Async: 197 Nested async: 197 Async: 198 Nested async: 198 Async: 199 Nested async: 199 Async: 200 Nested async: 200 Async: 201 Nested async: 201 Async: 202 Nested async: 202 Async: 203 Nested async: 203 Async: 204 Nested async: 204 Async: 205 Nested async: 205 Async: 206 Nested async: 206 Async: 207 Nested async: 207 Async: 208 Nested async: 208 Async: 209 Nested async: 209 Async: 210 Nested async: 210 Async: 211 Nested async: 211 Async: 212 Nested async: 212 Async: 213 Nested async: 213 Async: 214 Nested async: 214 Async: 215 Nested async: 215 Async: 216 Nested async: 216 Async: 217 Nested async: 217 Async: 218 Nested async: 218 Async: 219 Nested async: 219 Async: 220 Nested async: 220 Async: 221 Nested async: 221 Async: 222 Nested async: 222 Async: 223 Nested async: 223 Async: 224 Nested async: 224 Async: 225 Nested async: 225 Async: 226 Nested async: 226 Async: 227 Nested async: 227 Async: 228 Nested async: 228 Async: 229 Nested async: 229 Async: 230 Nested async: 230 Async: 231 Nested async: 231 Async: 232 Nested async: 232 Async: 233 Nested async: 233 Async: 234 Nested async: 234 Async: 235 Nested async: 235 Async: 236 Nested async: 236 Async: 237 Nested async: 237 Async: 238 Nested async: 238 Async: 239 Nested async: 239 Async: 240 Nested async: 240 Async: 241 Nested async: 241 Async: 242 Nested async: 242 Async: 243 Nested async: 243 Async: 244 Nested async: 244 Async: 245 Nested async: 245 Async: 246 Nested async: 246 Async: 247 Nested async: 247 Async: 248 Nested async: 248 Async: 249 Nested async: 249 Async: 250 Nested async: 250 Async: 251 Nested async: 251 Async: 252 Nested async: 252 Async: 253 Nested async: 253 Async: 254 Nested async: 254 Async: 255 Nested async: 255 Async: 256 Nested async: 256 Async: 257 Nested async: 257 Async: 258 Nested async: 258 Async: 259 Nested async: 259 Async: 260 Nested async: 260 Async: 261 Nested async: 261 Async: 262 Nested async: 262 Async: 263 Nested async: 263 Async: 264 Nested async: 264 Async: 265 Nested async: 265 Async: 266 Nested async: 266 Async: 267 Nested async: 267 Async: 268 Nested async: 268 Async: 269 Nested async: 269 Async: 270 Nested async: 270 Async: 271 Nested async: 271 Async: 272 Nested async: 272 Async: 273 Nested async: 273 Async: 274 Nested async: 274 Async: 275 Nested async: 275 Async: 276 Nested async: 276 Async: 277 Nested async: 277 Async: 278 Nested async: 278 Async: 279 Nested async: 279 Async: 280 Nested async: 280 Async: 281 Nested async: 281 Async: 282 Nested async: 282 Async: 283 Nested async: 283 Async: 284 Nested async: 284 Async: 285 Nested async: 285 Async: 286 Nested async: 286 Async: 287 Nested async: 287 Async: 288 Nested async: 288 Async: 289 Nested async: 289 Async: 290 Nested async: 290 Async: 291 Nested async: 291 Async: 292 Nested async: 292 Async: 293 Nested async: 293 Async: 294 Nested async: 294 Async: 295 Nested async: 295 Async: 296 Nested async: 296 Async: 297 Nested async: 297 Async: 298 Nested async: 298 Async: 299 Nested async: 299