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])
139 inline size_t size()
const
141 std::lock_guard<std::mutex> lock(m_mutex);
148 inline bool empty()
const
150 std::lock_guard<std::mutex> lock(m_mutex);
157 inline bool full()
const
159 std::lock_guard<std::mutex> lock(m_mutex);
160 return m_size == m_capacity;
166 inline size_t capacity()
const
176 std::lock_guard<std::mutex> lock(m_mutex);
177 m_size = m_head = m_tail = 0;
178 memset(m_buffer, 0,
sizeof(
T) * m_capacity);
184 inline bool push(
const T& value,
bool block =
true)
188 std::unique_lock<std::mutex> lock(m_mutex);
189 while(m_size == m_capacity)
191 m_full_condition.wait(lock);
196 std::lock_guard<std::mutex> lock(m_mutex);
197 if(m_size == m_capacity)
203 m_buffer[m_tail] = value;
204 m_tail = (m_tail + 1) % m_capacity;
207 m_empty_condition.notify_one();
214 inline bool push(
T&& value,
bool block =
true)
218 std::unique_lock<std::mutex> lock(m_mutex);
219 while(m_size == m_capacity)
221 m_full_condition.wait(lock);
226 std::lock_guard<std::mutex> lock(m_mutex);
227 if(m_size == m_capacity)
233 m_buffer[m_tail] = std::move(value);
234 m_tail = (m_tail + 1) % m_capacity;
237 m_empty_condition.notify_one();
244 inline bool pop(
T& value,
bool block =
true)
248 std::unique_lock<std::mutex> lock(m_mutex);
251 m_empty_condition.wait(lock);
256 std::lock_guard<std::mutex> lock(m_mutex);
263 value = std::move(m_buffer[m_head]);
264 m_head = (m_head + 1) % m_capacity;
267 m_full_condition.notify_one();
272 const size_t m_capacity;
273 size_t m_size, m_head, m_tail;
276 std::condition_variable m_full_condition;
277 std::condition_variable m_empty_condition;
281 #endif // TTKCONCURRENTQUEUE_H
The class of the concurrent queue.
void swap(TTKAny &left, TTKAny &right) noexcept
void push(const T &value)
bool pop(T &value, bool block=true)
std::condition_variable m_condition