Blame view

src/dvpp/threadsafe_queue.h 2.4 KB
63e6f7bc   Hu Chunming   完成dvpp。但是nv和gb281...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  
  #ifndef __THREADSAFE_QUEUE_H__
  #define __THREADSAFE_QUEUE_H__
  
  #include <queue>
  #include <mutex>
  #include <condition_variable>
  #include <initializer_list>
  
  #include <pthread.h>
  using std::queue;
  using namespace std;
  
  template <typename T>
  class ThreadedQueue : public queue<T> {
  public:
      ThreadedQueue();
      ~ThreadedQueue();
      bool empty() const;
      size_t size() const;
      void push(const T& val);
      void push(T& val);
      bool pop();
      T& front();
      const T& front() const;
      T& back();
      const T& back() const;
  
      void Put(T &data);
  
      T Take();
      void Get(T &data);
      bool GetEmpty();
  
      condition_variable *condition;
      mutex *lock;
  };
  
  template <typename T>
  ThreadedQueue<T>::ThreadedQueue() {
      lock = new mutex;
      condition = new condition_variable;
  }
  
  template <typename T>
  ThreadedQueue<T>::~ThreadedQueue() {
      if(condition != nullptr){
          delete condition;
          condition = nullptr;
      }
      if(lock != nullptr){
          delete lock;
          lock = nullptr;
      }
  }
  
  template <typename T>
  T ThreadedQueue<T>:: Take()
  {
      std::unique_lock<std::mutex> lk(this->lock);
      this->condition->wait(lk, [this]{return !this->empty();});
      T val = this->front();
      this->pop();
      return val;
  }
  
  template <typename T>
  void ThreadedQueue<T>:: Put(T &data)
  {
    std::unique_lock<std::mutex> lk(*lock);
    this->push(data);
    this->condition->notify_one();
    return;
  }
  
  template <typename T>
  void ThreadedQueue<T>:: Get(T &data)
  {
      std::unique_lock<std::mutex> lk(*lock);
      this->condition->wait(lk, [this]{return !this->empty();});
      data = this->front();
      this->pop();
  }
  
  template <typename T>
  bool ThreadedQueue<T>::GetEmpty()
  {
      std::unique_lock<std::mutex> lk(*lock);
      this->condition->wait(lk, [this]{return !this->empty();});
      return true;
  }
  
  
  template <typename T>
  bool ThreadedQueue<T>::empty() const {
      bool result = queue<T>::empty();
      return result;
  }
  
  template <typename T>
  size_t ThreadedQueue<T>::size() const {
      size_t result = queue<T>::size();
      return result;
  }
  
  template <typename T>
  void ThreadedQueue<T>::push(T& val) {
      queue<T>::push(val);
  }
  
  
  template <typename T>
  T& ThreadedQueue<T>::front() {
      T& result = queue<T>::front();
      return result;
  }
  
  template <typename T>
  bool ThreadedQueue<T>::pop() {
      bool result = false;
      if(!queue<T>::empty()) {
          queue<T>::pop();
          result = true;
      }
      return result;
  }
  
  #endif