跳转至

队列

参考



安全队列

C++
 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
#pragma once
#include <mutex>
#include <optional>
#include <queue>

template <typename T>
class queue_safe {
   public:
    queue_safe() = default;
    ~queue_safe() = default;
    queue_safe(const queue_safe&) = delete;
    queue_safe& operator=(const queue_safe&) = delete;
    queue_safe(queue_safe&&) = delete;
    queue_safe& operator=(queue_safe&&) = delete;

    void push(T&& value) {
        std::lock_guard<std::mutex> lock(_mutex);
        _queue.push(std::move(value));
    }

    std::optional<T> pop() {
        std::lock_guard<std::mutex> lock(_mutex);
        if (_queue.empty()) {
            return std::nullopt;
        }
        T result = std::move(_queue.front());
        _queue.pop();
        return result;
    }

   private:
    std::queue<T> _queue;
    std::mutex _mutex;
};