15#include <vsg/io/Logger.h>
16#include <vsg/threading/ActivityStatus.h>
17#include <vsg/threading/Latch.h>
23 enum InsertionPosition
31 class ThreadSafeQueue :
public Inherit<Object, ThreadSafeQueue<T>>
35 using container_type = std::list<value_type>;
46 void add(value_type operation, InsertionPosition insertionPosition = INSERT_BACK)
48 std::scoped_lock lock(_mutex);
49 if (insertionPosition == INSERT_BACK)
50 _queue.emplace_back(operation);
52 _queue.emplace_front(operation);
57 template<
typename Iterator>
58 void add(Iterator begin, Iterator end, InsertionPosition insertionPosition = INSERT_BACK)
60 size_t numAdditions = 0;
61 std::scoped_lock lock(_mutex);
62 for (
auto itr = begin; itr != end; ++itr)
64 if (insertionPosition == INSERT_BACK)
65 _queue.emplace_back(*itr);
67 _queue.emplace_front(*itr);
71 if (numAdditions == 1)
73 else if (numAdditions > 1)
80 std::unique_lock lock(_mutex);
81 return _queue.empty();
87 std::unique_lock lock(_mutex);
89 container_type objects;
98 std::unique_lock lock(_mutex);
100 if (_queue.empty())
return {};
102 auto operation = _queue.front();
104 _queue.erase(_queue.begin());
112 std::chrono::duration waitDuration = std::chrono::milliseconds(100);
114 std::unique_lock lock(_mutex);
117 while (_queue.empty() && _status->active())
120 _cv.wait_for(lock, waitDuration);
124 if (_status->cancel())
130 auto operation = _queue.front();
131 _queue.erase(_queue.begin());
136 mutable std::mutex _mutex;
137 std::condition_variable _cv;
138 container_type _queue;
148 virtual void run() = 0;
154 VSG_type_name(vsg::OperationQueue)
ActivityStatus provides atomic management of whether threads watching this ActivityStatus object shou...
Definition ActivityStatus.h:22
Template thread safe queue.
Definition OperationQueue.h:32
value_type take()
take the head from the queue of objects, return null pointer if none are available
Definition OperationQueue.h:96
container_type take_all()
take all available objects from the queue
Definition OperationQueue.h:85
value_type take_when_available()
take the head of the queue, waiting till one is made available if initially empty
Definition OperationQueue.h:110
void add(Iterator begin, Iterator end, InsertionPosition insertionPosition=INSERT_BACK)
add multiple objects to the back of the queue
Definition OperationQueue.h:58
void add(value_type operation, InsertionPosition insertionPosition=INSERT_BACK)
add a single object to the back of the queue
Definition OperationQueue.h:46
bool empty() const
return true if the queue is empty.
Definition OperationQueue.h:78
Operation base class.
Definition OperationQueue.h:147