You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							52 lines
						
					
					
						
							892 B
						
					
					
				
			
		
		
	
	
							52 lines
						
					
					
						
							892 B
						
					
					
				#pragma once
 | 
						|
 | 
						|
#include <condition_variable>
 | 
						|
#include <mutex>
 | 
						|
#include <queue>
 | 
						|
 | 
						|
template <class T>
 | 
						|
class SafeQueue {
 | 
						|
public:
 | 
						|
  SafeQueue() = default;
 | 
						|
 | 
						|
  void push(const T& v) {
 | 
						|
    {
 | 
						|
      std::unique_lock lk(m);
 | 
						|
      q.push(v);
 | 
						|
    }
 | 
						|
    cv.notify_one();
 | 
						|
  }
 | 
						|
 | 
						|
  T pop() {
 | 
						|
    std::unique_lock lk(m);
 | 
						|
    cv.wait(lk, [this] { return !q.empty(); });
 | 
						|
    T v = q.front();
 | 
						|
    q.pop();
 | 
						|
    return v;
 | 
						|
  }
 | 
						|
 | 
						|
  bool try_pop(T& v, int timeout_ms = 0) {
 | 
						|
    std::unique_lock lk(m);
 | 
						|
    if (!cv.wait_for(lk, std::chrono::milliseconds(timeout_ms), [this] { return !q.empty(); })) {
 | 
						|
      return false;
 | 
						|
    }
 | 
						|
    v = q.front();
 | 
						|
    q.pop();
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  bool empty() const {
 | 
						|
    std::scoped_lock lk(m);
 | 
						|
    return q.empty();
 | 
						|
  }
 | 
						|
 | 
						|
  size_t size() const {
 | 
						|
    std::scoped_lock lk(m);
 | 
						|
    return q.size();
 | 
						|
  }
 | 
						|
 | 
						|
private:
 | 
						|
  mutable std::mutex m;
 | 
						|
  std::condition_variable cv;
 | 
						|
  std::queue<T> q;
 | 
						|
};
 | 
						|
 |