栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

C++11 线程安全的队列模板 C++11 标准库版本

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

#include 
#include 
#include 
#include 


template
class SafeQueue
{
public:
    SafeQueue() {}
    ~SafeQueue() {}

    void push(T new_data) {
        std::lock_guard 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 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 wait_and_pop() {
        std::unique_lock ulk(m_mut);
        m_cond.wait(ulk,[this]() { return !m_dataQueue.empty(); });
        std::shared_ptr val(std::make_shared(std::move(m_dataQueue.front())));
        m_dataQueue.pop();
        return val;
    }

    bool try_pop(T& val) {
        std::lock_guard lk(m_mut);
        if(m_dataQueue.empty())
            return false;
        val=std::move(m_dataQueue.front());
        m_dataQueue.pop();
        return true;
    }

    std::shared_ptr try_pop() {
        std::shared_ptr val;
        std::lock_guard lk(m_mut);
        if(m_dataQueue.empty())
            return val;
        val=std::make_shared(std::move(m_dataQueue.front()));
        m_dataQueue.pop();
        return val;
    }

    bool empty() {
        std::lock_guard lk(m_mut);
        return m_dataQueue.empty();
    }

    int count() {
        std::lock_guard lk(m_mut);
        return m_dataQueue.size();
    }

private:
    std::queue m_dataQueue;
    std::mutex m_mut;
    std::condition_variable m_cond;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011586.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号