nndeploy C++ API  0.2.0
nndeploy C++ API
safe_ws_queue.h
Go to the documentation of this file.
1 
2 #ifndef _NNDEPLOY_THREAD_POOL_SAFE_WS_QUEUE_H_
3 #define _NNDEPLOY_THREAD_POOL_SAFE_WS_QUEUE_H_
4 
5 #include <deque>
6 #include <thread>
7 
8 namespace nndeploy {
9 namespace thread_pool {
10 
11 template <typename T>
12 class SafeWSQueue {
13  public:
19  bool tryPush(T &&task) {
20  bool result = false;
21  if (lock_.try_lock()) {
22  deque_.emplace_back(std::forward<T>(task));
23  lock_.unlock();
24  result = true;
25  }
26  return result;
27  }
28 
34  bool tryPop(T &task) {
35  bool result = false;
36  if (!deque_.empty() && lock_.try_lock()) {
37  if (!deque_.empty()) {
38  task = std::forward<T>(deque_.front()); // 从前方弹出
39  deque_.pop_front();
40  result = true;
41  }
42  lock_.unlock();
43  }
44 
45  return result;
46  }
47 
53  bool trySteal(T &task) {
54  bool result = false;
55  if (!deque_.empty() && lock_.try_lock()) {
56  if (!deque_.empty()) {
57  task = std::forward<T>(deque_.back()); // 从后方窃取
58  deque_.pop_back();
59  result = true;
60  }
61  lock_.unlock();
62  }
63 
64  return result;
65  }
66 
67  std::deque<T> &getQueue() { return deque_; }
68 
69  SafeWSQueue() = default;
70 
71  private:
72  std::deque<T> deque_; // 存放任务的双向队列
73  std::mutex lock_;
74 };
75 
76 } // namespace thread_pool
77 } // namespace nndeploy
78 
79 #endif //_NNDEPLOY_THREAD_POOL_SAFE_WS_QUEUE_H_