Wildmeshing Toolkit
Loading...
Searching...
No Matches
concurrent_priority_queue.hpp
1#pragma once
2
3#include <mutex>
4#include <queue>
5
6namespace wmtk::threading {
7// ---------------------------------------------------------------------------
8// concurrent_priority_queue: replaces tbb::concurrent_priority_queue.
9// Max-heap by default, matching TBB. std::priority_queue + mutex.
10// Non-movable (holds a mutex); constructed in place inside std::vector(count).
11// ---------------------------------------------------------------------------
12template <typename T, typename Compare = std::less<T>>
14{
15 mutable std::mutex m_mutex;
16 std::priority_queue<T, std::vector<T>, Compare> m_queue;
17
18public:
19 concurrent_priority_queue() = default;
21 concurrent_priority_queue& operator=(const concurrent_priority_queue&) = delete;
22
23 bool try_pop(T& out)
24 {
25 std::lock_guard<std::mutex> lock(m_mutex);
26 if (m_queue.empty()) {
27 return false;
28 }
29 out = m_queue.top();
30 m_queue.pop();
31 return true;
32 }
33
34 void push(const T& v)
35 {
36 std::lock_guard<std::mutex> lock(m_mutex);
37 m_queue.push(v);
38 }
39
40 template <typename... Args>
41 void emplace(Args&&... args)
42 {
43 std::lock_guard<std::mutex> lock(m_mutex);
44 m_queue.emplace(std::forward<Args>(args)...);
45 }
46
47 std::size_t size() const
48 {
49 std::lock_guard<std::mutex> lock(m_mutex);
50 return m_queue.size();
51 }
52 bool empty() const
53 {
54 std::lock_guard<std::mutex> lock(m_mutex);
55 return m_queue.empty();
56 }
57};
58
59} // namespace wmtk::threading
Definition concurrent_priority_queue.hpp:14