C++11 线程安全的队列模板

简介: C++11 线程安全的队列模板

C++11 线程安全的队列模板


C++11 标准库版本


主要参考C++11 并发编程第二版

#include <queue>
#include <mutex>
#include <memory>
#include <condition_variable>
template<typename T>
class SafeQueue
{
public:
    SafeQueue() {}
    ~SafeQueue() {}
    void push(T new_data) {
        std::lock_guard<std::m_mutex> lk(m_mut); // 1.全局加锁
        m_dataQueue.push(std::move(new_data)); // 2.push时独占锁
        m_cond.notify_one();
    }
    void wait_and_pop(T& val) {
        std::unique_lock<std::m_mutex> ulk(m_mut); // 3.全局加锁
        m_cond.wait(ulk,[this]() { return !m_dataQueue.empty(); }); // 4.front 和 pop_front时独占锁
        val=std::move(m_dataQueue.front());
        m_dataQueue.pop();
    }
    std::shared_ptr<T> wait_and_pop() {
        std::unique_lock<std::m_mutex> ulk(m_mut);
        m_cond.wait(ulk,[this]() { return !m_dataQueue.empty(); });
        std::shared_ptr<T> val(std::make_shared<T>(std::move(m_dataQueue.front())));
        m_dataQueue.pop();
        return val;
    }
    bool try_pop(T& val) {
        std::lock_guard<std::m_mutex> lk(m_mut);
        if(m_dataQueue.empty())
            return false;
        val=std::move(m_dataQueue.front());
        m_dataQueue.pop();
        return true;
    }
    std::shared_ptr<T> try_pop() {
        std::shared_ptr<T> val;
        std::lock_guard<std::m_mutex> lk(m_mut);
        if(m_dataQueue.empty())
            return val;
        val=std::make_shared<T>(std::move(m_dataQueue.front()));
        m_dataQueue.pop();
        return val;
    }
    bool empty() {
        std::lock_guard<std::m_mutex> lk(m_mut);
        return m_dataQueue.empty();
    }
    int count() {
        std::lock_guard<std::m_mutex> lk(m_mut);
        return m_dataQueue.size();
    }
private:
    std::queue<T> m_dataQueue;
    std::mutex m_mut;
    std::condition_variable m_cond;
}
相关文章
|
3天前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
15 1
【C++】——初识模板
|
2月前
|
程序员 C++
C++模板元编程入门
【7月更文挑战第9天】C++模板元编程是一项强大而复杂的技术,它允许程序员在编译时进行复杂的计算和操作,从而提高了程序的性能和灵活性。然而,模板元编程的复杂性和抽象性也使其难以掌握和应用。通过本文的介绍,希望能够帮助你初步了解C++模板元编程的基本概念和技术要点,为进一步深入学习和应用打下坚实的基础。在实际开发中,合理运用模板元编程技术,可以极大地提升程序的性能和可维护性。
|
9天前
|
存储 监控 Java
|
16天前
|
Java 调度
基于C++11的线程池
基于C++11的线程池
|
18天前
|
编译器 C++
【C++】模板初级
【C++】模板初级
|
18天前
|
安全 编译器 C++
【C++】模板进阶
【C++】模板进阶
|
3天前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
10天前
|
并行计算 测试技术 开发工具
【简历模板】c/c++软件工程师
【简历模板】c/c++软件工程师
26 0
|
2月前
|
算法 编译器 C++
开发与运维线程问题之在C++的原子操作中memory_order如何解决
开发与运维线程问题之在C++的原子操作中memory_order如何解决
27 2
|
16天前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决