#include <stdlib.h> #include <stdint.h> #include <iostream> #include <mutex> #include <condition_variable> #include <cassert> template<typename T, int32_t MAX_SIZE_QUEUE = 256> class BoundedQueue { public: BoundedQueue() : start(MAX_SIZE_QUEUE - 1), end(MAX_SIZE_QUEUE - 1) {} void Enqueue(const T &value) { if (abs(end - start) >= MAX_SIZE_QUEUE) { return; } data[end] = value; end = --end % MAX_SIZE_QUEUE; } void Dequeue(T *out_value) { if (!out_value || Empty()) { return; } *out_value = data[start]; start = --start % MAX_SIZE_QUEUE; } bool Empty() const { return start == end; } private: int start; int end; T data[MAX_SIZE_QUEUE]; }; template<typename T, int32_t MAX_SIZE_QUEUE = 256> class ThreadSafeQueue { public: ThreadSafeQueue() {} ThreadSafeQueue(const ThreadSafeQueue &) = delete; ThreadSafeQueue &operator=(const ThreadSafeQueue &) = delete; void Push(T new_value) { std::lock_guard<std::mutex> lk(mutex); data_queue.Enqueue(new_value); data_cond.notify_all(); } void WaitAndPop(T *value) { std::unique_lock<std::mutex> lk(mutex); data_cond.wait(lk, [this] { return !data_queue.Empty(); }); data_queue.Dequeue(value); } bool Empty() const { std::lock_guard<std::mutex> lk(mutex); return data_queue.Empty(); } private: mutable std::mutex mutex; std::condition_variable data_cond; BoundedQueue<T, MAX_SIZE_QUEUE> data_queue; }; int main() { std::cout << "Hello, World!" << std::endl; ThreadSafeQueue<int, 256> queue; for (int i = 0; i < 256; ++i) { queue.Push(i); } for (int i = 0; i < 256; ++i) { int result = 0; queue.WaitAndPop(&result); printf("result:%i == i:%i\n", result, i); assert(result == i); } return 0; }
Standard input is empty
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