fork download
  1. #include <stdlib.h>
  2. #include <stdint.h>
  3. #include <iostream>
  4. #include <mutex>
  5. #include <condition_variable>
  6. #include <cassert>
  7.  
  8.  
  9. template<typename T, int32_t MAX_SIZE_QUEUE = 256>
  10. class BoundedQueue {
  11. public:
  12. BoundedQueue() : start(MAX_SIZE_QUEUE - 1), end(MAX_SIZE_QUEUE - 1) {}
  13.  
  14. void Enqueue(const T &value) {
  15. if (abs(end - start) >= MAX_SIZE_QUEUE) { return; }
  16. data[end] = value;
  17. end = --end % MAX_SIZE_QUEUE;
  18. }
  19.  
  20. void Dequeue(T *out_value) {
  21. if (!out_value || Empty()) { return; }
  22. *out_value = data[start];
  23. start = --start % MAX_SIZE_QUEUE;
  24. }
  25.  
  26. bool Empty() const {
  27. return start == end;
  28. }
  29.  
  30. private:
  31. int start;
  32. int end;
  33. T data[MAX_SIZE_QUEUE];
  34. };
  35.  
  36. template<typename T, int32_t MAX_SIZE_QUEUE = 256>
  37. class ThreadSafeQueue {
  38. public:
  39. ThreadSafeQueue() {}
  40.  
  41. ThreadSafeQueue(const ThreadSafeQueue &) = delete;
  42. ThreadSafeQueue &operator=(const ThreadSafeQueue &) = delete;
  43.  
  44. void Push(T new_value) {
  45. std::lock_guard<std::mutex> lk(mutex);
  46. data_queue.Enqueue(new_value);
  47. data_cond.notify_all();
  48. }
  49.  
  50. void WaitAndPop(T *value) {
  51. std::unique_lock<std::mutex> lk(mutex);
  52. data_cond.wait(lk, [this] { return !data_queue.Empty(); });
  53. data_queue.Dequeue(value);
  54. }
  55.  
  56. bool Empty() const {
  57. std::lock_guard<std::mutex> lk(mutex);
  58. return data_queue.Empty();
  59. }
  60.  
  61. private:
  62. mutable std::mutex mutex;
  63. std::condition_variable data_cond;
  64. BoundedQueue<T, MAX_SIZE_QUEUE> data_queue;
  65. };
  66.  
  67. int main() {
  68. std::cout << "Hello, World!" << std::endl;
  69.  
  70. ThreadSafeQueue<int, 256> queue;
  71. for (int i = 0; i < 256; ++i) {
  72. queue.Push(i);
  73. }
  74.  
  75. for (int i = 0; i < 256; ++i) {
  76. int result = 0;
  77. queue.WaitAndPop(&result);
  78. printf("result:%i == i:%i\n", result, i);
  79. assert(result == i);
  80. }
  81.  
  82. return 0;
  83. }
Success #stdin #stdout 0s 16064KB
stdin
Standard input is empty
stdout
Hello, World!
result:0 == i:0
result:1 == i:1
result:2 == i:2
result:3 == i:3
result:4 == i:4
result:5 == i:5
result:6 == i:6
result:7 == i:7
result:8 == i:8
result:9 == i:9
result:10 == i:10
result:11 == i:11
result:12 == i:12
result:13 == i:13
result:14 == i:14
result:15 == i:15
result:16 == i:16
result:17 == i:17
result:18 == i:18
result:19 == i:19
result:20 == i:20
result:21 == i:21
result:22 == i:22
result:23 == i:23
result:24 == i:24
result:25 == i:25
result:26 == i:26
result:27 == i:27
result:28 == i:28
result:29 == i:29
result:30 == i:30
result:31 == i:31
result:32 == i:32
result:33 == i:33
result:34 == i:34
result:35 == i:35
result:36 == i:36
result:37 == i:37
result:38 == i:38
result:39 == i:39
result:40 == i:40
result:41 == i:41
result:42 == i:42
result:43 == i:43
result:44 == i:44
result:45 == i:45
result:46 == i:46
result:47 == i:47
result:48 == i:48
result:49 == i:49
result:50 == i:50
result:51 == i:51
result:52 == i:52
result:53 == i:53
result:54 == i:54
result:55 == i:55
result:56 == i:56
result:57 == i:57
result:58 == i:58
result:59 == i:59
result:60 == i:60
result:61 == i:61
result:62 == i:62
result:63 == i:63
result:64 == i:64
result:65 == i:65
result:66 == i:66
result:67 == i:67
result:68 == i:68
result:69 == i:69
result:70 == i:70
result:71 == i:71
result:72 == i:72
result:73 == i:73
result:74 == i:74
result:75 == i:75
result:76 == i:76
result:77 == i:77
result:78 == i:78
result:79 == i:79
result:80 == i:80
result:81 == i:81
result:82 == i:82
result:83 == i:83
result:84 == i:84
result:85 == i:85
result:86 == i:86
result:87 == i:87
result:88 == i:88
result:89 == i:89
result:90 == i:90
result:91 == i:91
result:92 == i:92
result:93 == i:93
result:94 == i:94
result:95 == i:95
result:96 == i:96
result:97 == i:97
result:98 == i:98
result:99 == i:99
result:100 == i:100
result:101 == i:101
result:102 == i:102
result:103 == i:103
result:104 == i:104
result:105 == i:105
result:106 == i:106
result:107 == i:107
result:108 == i:108
result:109 == i:109
result:110 == i:110
result:111 == i:111
result:112 == i:112
result:113 == i:113
result:114 == i:114
result:115 == i:115
result:116 == i:116
result:117 == i:117
result:118 == i:118
result:119 == i:119
result:120 == i:120
result:121 == i:121
result:122 == i:122
result:123 == i:123
result:124 == i:124
result:125 == i:125
result:126 == i:126
result:127 == i:127
result:128 == i:128
result:129 == i:129
result:130 == i:130
result:131 == i:131
result:132 == i:132
result:133 == i:133
result:134 == i:134
result:135 == i:135
result:136 == i:136
result:137 == i:137
result:138 == i:138
result:139 == i:139
result:140 == i:140
result:141 == i:141
result:142 == i:142
result:143 == i:143
result:144 == i:144
result:145 == i:145
result:146 == i:146
result:147 == i:147
result:148 == i:148
result:149 == i:149
result:150 == i:150
result:151 == i:151
result:152 == i:152
result:153 == i:153
result:154 == i:154
result:155 == i:155
result:156 == i:156
result:157 == i:157
result:158 == i:158
result:159 == i:159
result:160 == i:160
result:161 == i:161
result:162 == i:162
result:163 == i:163
result:164 == i:164
result:165 == i:165
result:166 == i:166
result:167 == i:167
result:168 == i:168
result:169 == i:169
result:170 == i:170
result:171 == i:171
result:172 == i:172
result:173 == i:173
result:174 == i:174
result:175 == i:175
result:176 == i:176
result:177 == i:177
result:178 == i:178
result:179 == i:179
result:180 == i:180
result:181 == i:181
result:182 == i:182
result:183 == i:183
result:184 == i:184
result:185 == i:185
result:186 == i:186
result:187 == i:187
result:188 == i:188
result:189 == i:189
result:190 == i:190
result:191 == i:191
result:192 == i:192
result:193 == i:193
result:194 == i:194
result:195 == i:195
result:196 == i:196
result:197 == i:197
result:198 == i:198
result:199 == i:199
result:200 == i:200
result:201 == i:201
result:202 == i:202
result:203 == i:203
result:204 == i:204
result:205 == i:205
result:206 == i:206
result:207 == i:207
result:208 == i:208
result:209 == i:209
result:210 == i:210
result:211 == i:211
result:212 == i:212
result:213 == i:213
result:214 == i:214
result:215 == i:215
result:216 == i:216
result:217 == i:217
result:218 == i:218
result:219 == i:219
result:220 == i:220
result:221 == i:221
result:222 == i:222
result:223 == i:223
result:224 == i:224
result:225 == i:225
result:226 == i:226
result:227 == i:227
result:228 == i:228
result:229 == i:229
result:230 == i:230
result:231 == i:231
result:232 == i:232
result:233 == i:233
result:234 == i:234
result:235 == i:235
result:236 == i:236
result:237 == i:237
result:238 == i:238
result:239 == i:239
result:240 == i:240
result:241 == i:241
result:242 == i:242
result:243 == i:243
result:244 == i:244
result:245 == i:245
result:246 == i:246
result:247 == i:247
result:248 == i:248
result:249 == i:249
result:250 == i:250
result:251 == i:251
result:252 == i:252
result:253 == i:253
result:254 == i:254
result:255 == i:255