Advertisement
Xirema

Concurrent Queue.h

Feb 17th, 2016
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.39 KB | None | 0 0
  1. #pragma once
  2. #include<queue>
  3. #include<condition_variable>
  4. #include<mutex>
  5. #include<functional>
  6.  
  7. namespace concurrent {
  8.  
  9.     typedef std::function<bool(void)> c_queue_predicate;
  10.  
  11.     template<typename T>
  12.     class queue {
  13.     private:
  14.         std::queue<T> _queue;
  15.         mutable std::mutex _mutex;
  16.         mutable std::condition_variable _cond;
  17.     public:
  18.         void push(const T & t) {
  19.             std::unique_lock<std::mutex> lock(_mutex);
  20.             _queue.push(t);
  21.             lock.unlock();
  22.             _cond.notify_one();
  23.         }
  24.  
  25.         bool empty() const {
  26.             std::unique_lock<std::mutex> lock(_mutex);
  27.             return _queue.empty();
  28.         }
  29.  
  30.         bool try_pop(T & value) {
  31.             std::unique_lock<std::mutex> lock(_mutex);
  32.             if (_queue.empty()) {
  33.                 return false;
  34.             }
  35.  
  36.             value = _queue.front();
  37.             _queue.pop();
  38.             return true;
  39.         }
  40.  
  41.         void wait_and_pop(T & value) {
  42.             std::unique_lock<std::mutex> lock(_mutex);
  43.             _cond.wait(lock, [&]() {return !_queue.empty(); });
  44.  
  45.             value = _queue.front();
  46.             _queue.pop();
  47.         }
  48.  
  49.         bool wait_and_pop(T & value, c_queue_predicate & test) {
  50.             std::unique_lock<std::mutex> lock(_mutex);
  51.             while (_queue.empty() && !test())
  52.                 _cond.wait(lock, test);
  53.  
  54.             if (test()) return false;
  55.             value = _queue.front();
  56.             _queue.pop();
  57.             return true;
  58.         }
  59.  
  60.         size_t size() const {
  61.             std::unique_lock<std::mutex> lock(_mutex);
  62.             return _queue.size();
  63.         }
  64.  
  65.         void wake_all() {
  66.             _cond.notify_all();
  67.         }
  68.     };
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement