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;
}
相关文章
|
2月前
|
编译器 C++
【C++】——初识模板
【C++】——初识模板
33 1
【C++】——初识模板
|
6天前
|
存储 算法 程序员
C++ 11新特性之可变参数模板
C++ 11新特性之可变参数模板
15 0
|
2月前
|
存储 监控 Java
|
2月前
|
Java 调度
基于C++11的线程池
基于C++11的线程池
|
2月前
|
编译器 C++
【C++】模板初级
【C++】模板初级
|
2月前
|
安全 编译器 C++
【C++】模板进阶
【C++】模板进阶
|
2月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
2月前
|
并行计算 测试技术 开发工具
【简历模板】c/c++软件工程师
【简历模板】c/c++软件工程师
51 0
|
3月前
|
算法 编译器 C++
开发与运维线程问题之在C++的原子操作中memory_order如何解决
开发与运维线程问题之在C++的原子操作中memory_order如何解决
35 2
|
3月前
|
安全 编译器 C++
C++一分钟之-模板元编程实例:类型 traits
【7月更文挑战第15天】C++的模板元编程利用编译时计算提升性能,类型traits是其中的关键,用于查询和修改类型信息。文章探讨了如何使用和避免过度复杂化、误用模板特化及依赖特定编译器的问题。示例展示了`is_same`类型trait的实现,用于检查类型相等。通过`add_pointer`和`remove_reference`等traits,可以构建更复杂的类型转换逻辑。类型traits增强了代码效率和安全性,是深入C++编程的必备工具。
55 11