threadsafe_queue: Add std::stop_token overload to PopWait
Useful for jthreads which make use of the threadsafe queues.
This commit is contained in:
		@@ -14,7 +14,7 @@
 | 
			
		||||
#include <utility>
 | 
			
		||||
 | 
			
		||||
namespace Common {
 | 
			
		||||
template <typename T>
 | 
			
		||||
template <typename T, bool with_stop_token = false>
 | 
			
		||||
class SPSCQueue {
 | 
			
		||||
public:
 | 
			
		||||
    SPSCQueue() {
 | 
			
		||||
@@ -84,7 +84,7 @@ public:
 | 
			
		||||
    void Wait() {
 | 
			
		||||
        if (Empty()) {
 | 
			
		||||
            std::unique_lock lock{cv_mutex};
 | 
			
		||||
            cv.wait(lock, [this]() { return !Empty(); });
 | 
			
		||||
            cv.wait(lock, [this] { return !Empty(); });
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -95,6 +95,19 @@ public:
 | 
			
		||||
        return t;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T PopWait(std::stop_token stop_token) {
 | 
			
		||||
        if (Empty()) {
 | 
			
		||||
            std::unique_lock lock{cv_mutex};
 | 
			
		||||
            cv.wait(lock, stop_token, [this] { return !Empty(); });
 | 
			
		||||
        }
 | 
			
		||||
        if (stop_token.stop_requested()) {
 | 
			
		||||
            return T{};
 | 
			
		||||
        }
 | 
			
		||||
        T t;
 | 
			
		||||
        Pop(t);
 | 
			
		||||
        return t;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // not thread-safe
 | 
			
		||||
    void Clear() {
 | 
			
		||||
        size.store(0);
 | 
			
		||||
@@ -123,13 +136,13 @@ private:
 | 
			
		||||
    ElementPtr* read_ptr;
 | 
			
		||||
    std::atomic_size_t size{0};
 | 
			
		||||
    std::mutex cv_mutex;
 | 
			
		||||
    std::condition_variable cv;
 | 
			
		||||
    std::conditional_t<with_stop_token, std::condition_variable_any, std::condition_variable> cv;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// a simple thread-safe,
 | 
			
		||||
// single reader, multiple writer queue
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
template <typename T, bool with_stop_token = false>
 | 
			
		||||
class MPSCQueue {
 | 
			
		||||
public:
 | 
			
		||||
    [[nodiscard]] std::size_t Size() const {
 | 
			
		||||
@@ -166,13 +179,17 @@ public:
 | 
			
		||||
        return spsc_queue.PopWait();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    T PopWait(std::stop_token stop_token) {
 | 
			
		||||
        return spsc_queue.PopWait(stop_token);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // not thread-safe
 | 
			
		||||
    void Clear() {
 | 
			
		||||
        spsc_queue.Clear();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    SPSCQueue<T> spsc_queue;
 | 
			
		||||
    SPSCQueue<T, with_stop_token> spsc_queue;
 | 
			
		||||
    std::mutex write_lock;
 | 
			
		||||
};
 | 
			
		||||
} // namespace Common
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user