1 #ifndef TTKCONCURRENTQUEUE_H
2 #define TTKCONCURRENTQUEUE_H
24 #include <condition_variable>
50 std::lock_guard<std::mutex> lock(
m_mutex);
59 std::lock_guard<std::mutex> lock(
m_mutex);
68 std::lock_guard<std::mutex> lock(
m_mutex);
76 inline void push(
const T &value)
78 std::lock_guard<std::mutex> lock(
m_mutex);
86 inline bool pop(
T &value,
bool block =
true)
91 std::unique_lock<std::mutex> lock(
m_mutex);
99 std::lock_guard<std::mutex> lock(
m_mutex);
106 value = std::move(
m_queue.front());
120 : m_capacity(capacity),
124 m_buffer(new
T[capacity])
140 inline size_t size()
const
142 std::lock_guard<std::mutex> lock(m_mutex);
149 inline bool empty()
const
151 std::lock_guard<std::mutex> lock(m_mutex);
158 inline bool full()
const
160 std::lock_guard<std::mutex> lock(m_mutex);
161 return m_size == m_capacity;
167 inline size_t capacity()
const noexcept
177 std::lock_guard<std::mutex> lock(m_mutex);
178 m_size = m_head = m_tail = 0;
179 memset(m_buffer, 0,
sizeof(
T) * m_capacity);
185 inline bool push(
const T& value,
bool block =
true)
189 std::unique_lock<std::mutex> lock(m_mutex);
190 while(m_size == m_capacity)
192 m_full_condition.wait(lock);
197 std::lock_guard<std::mutex> lock(m_mutex);
198 if(m_size == m_capacity)
204 m_buffer[m_tail] = value;
205 m_tail = (m_tail + 1) % m_capacity;
208 m_empty_condition.notify_one();
215 inline bool push(
T&& value,
bool block =
true)
219 std::unique_lock<std::mutex> lock(m_mutex);
220 while(m_size == m_capacity)
222 m_full_condition.wait(lock);
227 std::lock_guard<std::mutex> lock(m_mutex);
228 if(m_size == m_capacity)
234 m_buffer[m_tail] = std::move(value);
235 m_tail = (m_tail + 1) % m_capacity;
238 m_empty_condition.notify_one();
245 inline bool pop(
T& value,
bool block =
true)
249 std::unique_lock<std::mutex> lock(m_mutex);
252 m_empty_condition.wait(lock);
257 std::lock_guard<std::mutex> lock(m_mutex);
264 value = std::move(m_buffer[m_head]);
265 m_head = (m_head + 1) % m_capacity;
268 m_full_condition.notify_one();
273 const size_t m_capacity;
274 size_t m_size, m_head, m_tail;
277 std::condition_variable m_full_condition;
278 std::condition_variable m_empty_condition;
282 #endif // TTKCONCURRENTQUEUE_H
The class of the concurrent queue.
TTKConcurrentQueue() noexcept
void swap(TTKAny &left, TTKAny &right) noexcept
void push(const T &value)
bool pop(T &value, bool block=true)
std::condition_variable m_condition