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;
}
相关文章
|
16小时前
|
编译器 C语言 C++
从C语言到C++_21(模板进阶+array)+相关笔试题(上)
从C语言到C++_21(模板进阶+array)+相关笔试题
9 0
|
4天前
|
存储 算法 C++
高效利用C++ STL库:标准模板库的使用技巧
本文介绍了C++ STL(标准模板库)的高效使用技巧,包括选择合适的容器类型、使用`emplace_back`而非`push_back`、预分配容器空间和范围for循环遍历容器。此外,还讨论了STL算法的运用,如用算法替代手动循环、使用lambda表达式和进行容器操作。通过这些技巧,开发者可以提升C++代码的性能和可读性。
|
4天前
|
程序员 编译器 C++
C++中的模板与泛型编程技术深度解析
C++中的模板与泛型编程技术深度解析
|
5天前
|
算法 C++
c++算法学习笔记 (14) 栈与队列
c++算法学习笔记 (14) 栈与队列
|
5天前
|
存储 算法 程序员
C++模板编程与泛型技术探秘
这篇文章探讨了C++中的模板编程和泛型技术,这两种技术增强了代码复用和抽象能力。文章介绍了函数模板和类模板的概念,通过示例展示了如何定义和使用它们。泛型技术是一种编程范式,强调编写与类型无关的代码,提高代码复用性和灵活性。C++11后的版本通过类型萃取和变长模板参数进一步扩展了模板功能。模板和泛型广泛应用在数据结构、算法、库和框架的开发中,如STL。掌握这些技术有助于编写更高效、灵活的代码,并推动软件开发的创新和进步。
|
5天前
|
安全 Go 对象存储
C++多线程编程:并发与同步的实战应用
本文介绍了C++中的多线程编程,包括基础知识和实战应用。C++借助`&lt;thread&gt;`库支持多线程,通过`std::thread`创建线程执行任务。文章探讨了并发与同步的概念,如互斥锁(Mutex)用于保护共享资源,条件变量(Condition Variable)协调线程等待与通知,以及原子操作(Atomic Operations)保证线程安全。实战部分展示了如何使用多线程进行并发计算,利用`std::async`实现异步任务并获取结果。多线程编程能提高效率,但也需注意数据竞争和同步问题,以确保程序的正确性。
|
7天前
|
编译器 C++
【C++】模板进阶 -- 详解
【C++】模板进阶 -- 详解
|
7天前
|
编译器 C++ 容器
C++模板的原理及使用
C++模板的原理及使用
|
7天前
|
编译器 程序员 C语言
【C++】模板初阶 -- 详解
【C++】模板初阶 -- 详解
|
8天前
|
算法 编译器 C语言
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL(下)
从C语言到C++⑩(第四章_模板初阶+STL简介)如何学习STL
14 0