VisionWorks Toolkit Reference

December 18, 2015 | 1.2 Release

 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ThreadSafeQueue.hpp
Go to the documentation of this file.
1 /*
2 # Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
3 #
4 # Redistribution and use in source and binary forms, with or without
5 # modification, are permitted provided that the following conditions
6 # are met:
7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above copyright
10 # notice, this list of conditions and the following disclaimer in the
11 # documentation and/or other materials provided with the distribution.
12 # * Neither the name of NVIDIA CORPORATION nor the names of its
13 # contributors may be used to endorse or promote products derived
14 # from this software without specific prior written permission.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
17 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
20 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28 
29 #ifndef BUFFERQUEUE_HPP
30 #define BUFFERQUEUE_HPP
31 
32 #include <cassert>
33 #include <chrono>
34 #include <condition_variable>
35 #include <cstdlib>
36 #include <queue>
37 #include <mutex>
38 
44 namespace nvxio
45 {
46 
58 const unsigned int TIMEOUT_INFINITE = 0xFFFFFFFF;
59 
66 template <typename T>
68 {
69 public:
70 
76  explicit ThreadSafeQueue(std::size_t maxSize) : maxSize(maxSize)
77  {}
78 
88  bool push(const T& item, unsigned int timeout = 1 /*milliseconds*/)
89  {
90  std::unique_lock<std::mutex> lock(mutex);
91 
92  bool stillFull = !condNonFull.wait_for(lock,
93  std::chrono::milliseconds(timeout),
94  [this]() { return queue.size() < maxSize; });
95 
96  if (stillFull) return false;
97 
98  queue.push(item);
99  condNonEmpty.notify_all();
100 
101  return true;
102  }
103 
113  bool pop(T& item, unsigned int timeout = 1 /*milliseconds*/)
114  {
115  std::unique_lock<std::mutex> lock(mutex);
116 
117  bool stillEmpty = !condNonEmpty.wait_for(lock,
118  std::chrono::milliseconds(timeout),
119  [this]() { return !queue.empty(); });
120 
121  if (stillEmpty) return false;
122 
123  item = queue.front();
124  queue.pop();
125  condNonFull.notify_all();
126 
127  return true;
128  }
129 
133  void clear()
134  {
135  std::lock_guard<std::mutex> lock(mutex);
136 
137  while(!queue.empty())
138  queue.pop();
139 
140  condNonFull.notify_all();
141  }
142 
143 protected:
144  std::queue<T> queue;
145  std::size_t maxSize;
146 
147  std::mutex mutex;
148  std::condition_variable condNonEmpty, condNonFull;
149 
152 };
153 
154 }
155 #endif // BUFFERQUEUE_HPP
bool push(const T &item, unsigned int timeout=1)
Attemps to push a new value into the queue.
std::condition_variable condNonEmpty
std::condition_variable condNonFull
ThreadSafeQueue & operator=(const ThreadSafeQueue &)
Thread-Safe Queue class.
void clear()
Removes all elements from the queue.
const unsigned int TIMEOUT_INFINITE
A maximum timeout.
ThreadSafeQueue(std::size_t maxSize)
Creation of a thread-safe queue with a specified capacity.
bool pop(T &item, unsigned int timeout=1)
Attemps to pop the oldest value from the queue.