fork download
  1. #include <stdio.h>
  2. #include <future>
  3. #include <array>
  4. #include <atomic>
  5. #include <vector>
  6.  
  7. struct Worker
  8. {
  9. virtual ~Worker() { }
  10. virtual void Init() = 0;
  11. virtual void Work() = 0;
  12. };
  13.  
  14. struct BasicWorker : public Worker
  15. {
  16. virtual ~BasicWorker() { }
  17. virtual void Init()
  18. {
  19. printf("\t\t\t\tInit: %d\n", std::this_thread::get_id());
  20. }
  21.  
  22. virtual void Work()
  23. {
  24. printf("\t\t\t\tWork: %d\n", std::this_thread::get_id());
  25. }
  26. };
  27.  
  28. struct GroupWorker : public Worker
  29. {
  30. GroupWorker()
  31. {
  32. workers.push_back(std::make_shared<BasicWorker>());
  33. }
  34.  
  35. virtual ~GroupWorker() { }
  36.  
  37. virtual void Init()
  38. {
  39. for(int i = 0; i < workers.size(); ++i)
  40. {
  41. workers[i]->Init();
  42. }
  43. initEvent.notify_all();
  44. }
  45.  
  46. virtual void Work()
  47. {
  48. for(int i = 0; i < workers.size(); ++i)
  49. {
  50. workers[i]->Work();
  51. }
  52. }
  53.  
  54. void WaitForInit()
  55. {
  56. //std::unique_lock<std::mutex> initLock(initMutex);
  57. //initEvent.wait(initLock);
  58. }
  59. private:
  60. std::mutex initMutex;
  61. std::condition_variable initEvent;
  62. std::vector<std::shared_ptr<Worker>> workers;
  63. };
  64.  
  65. struct Handler
  66. {
  67. static const int Stopped = -1;
  68. static const int Ready = 0;
  69. static const int Running = 1;
  70.  
  71. Handler(const std::shared_ptr<Worker>& worker) :
  72. worker(worker)
  73. { }
  74.  
  75. void Start(int count)
  76. {
  77. int readyValue = Ready;
  78. if(working.compare_exchange_strong(readyValue, Running))
  79. {
  80. worker->Init();
  81.  
  82. for(int i = 0; i < count && working == Running; ++i)
  83. {
  84. worker->Work();
  85. }
  86. }
  87. }
  88.  
  89. void Stop()
  90. {
  91. working = Stopped;
  92. }
  93. private:
  94. std::atomic<int> working;
  95. std::shared_ptr<Worker> worker;
  96. };
  97.  
  98. std::future<void> Start(int jobIndex, int runCount)
  99. {
  100. //printf("Start: %d\n", jobIndex);
  101. return std::async([=]()
  102. {
  103. printf("Async: %d\n", jobIndex);
  104. auto worker = std::make_shared<GroupWorker>();
  105. auto handler = std::make_shared<Handler>(worker);
  106.  
  107. auto result = std::async([=]()
  108. {
  109. printf("Nested async: %d\n", jobIndex);
  110. handler->Start(runCount);
  111. });
  112.  
  113. worker->WaitForInit();
  114. handler->Stop();
  115.  
  116. result.get();
  117. });
  118. }
  119.  
  120. int main()
  121. {
  122. const int JobCount = 300;
  123. const int RunCount = 5;
  124. std::array<std::future<void>, JobCount> jobs;
  125.  
  126. for(int i = 0; i < JobCount; ++i)
  127. {
  128. jobs[i] = Start(i, RunCount);
  129. }
  130.  
  131. for(int i = 0; i < JobCount; ++i)
  132. {
  133. jobs[i].get();
  134. }
  135. }
Success #stdin #stdout 0s 3092KB
stdin
Standard input is empty
stdout
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