Wildmeshing Toolkit
Loading...
Searching...
No Matches
concurrent_queue.hpp
1#pragma once
2
3#include <deque>
4#include <mutex>
5
6namespace wmtk::threading {
7// ---------------------------------------------------------------------------
8// concurrent_queue: replaces tbb::concurrent_queue (FIFO). std::deque + mutex.
9// ---------------------------------------------------------------------------
10template <typename T>
12{
13 mutable std::mutex m_mutex;
14 std::deque<T> m_queue;
15
16public:
17 concurrent_queue() = default;
18 concurrent_queue(const concurrent_queue&) = delete;
19 concurrent_queue& operator=(const concurrent_queue&) = delete;
20
21 bool try_pop(T& out)
22 {
23 std::lock_guard<std::mutex> lock(m_mutex);
24 if (m_queue.empty()) {
25 return false;
26 }
27 out = std::move(m_queue.front());
28 m_queue.pop_front();
29 return true;
30 }
31 void push(const T& v)
32 {
33 std::lock_guard<std::mutex> lock(m_mutex);
34 m_queue.push_back(v);
35 }
36 template <typename... Args>
37 void emplace(Args&&... args)
38 {
39 std::lock_guard<std::mutex> lock(m_mutex);
40 m_queue.emplace_back(std::forward<Args>(args)...);
41 }
42
43 // std::size_t unsafe_size() const { return m_queue.size(); }
44
45 bool empty() const
46 {
47 std::lock_guard<std::mutex> lock(m_mutex);
48 return m_queue.empty();
49 }
50};
51
52} // namespace wmtk::threading
Definition concurrent_queue.hpp:12