C++线程安全的队列是什么
发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章将为大家详细讲解有关C++线程安全的队列是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。无界队列#include#include#include#inc
千家信息网最后更新 2025年01月16日C++线程安全的队列是什么
这篇文章将为大家详细讲解有关C++线程安全的队列是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
无界队列
#include#include #include #include #include #include template >class Queue //无界队列{public: Queue() = default; ~Queue() = default; //禁止拷贝和移动,编译器会自动delete /*Queue(const Queue&) = delete; Queue(Queue&&) = delete; Queue& operator=(const Queue&) = delete; Queue& operator=(Queue&&) = delete;*/ void push(const T& val) { emplace(val); } void push(T&& val) { emplace(std::move(val)); } template void emplace(Args&&...args) { std::lock_guard lk{ mtx_ }; q_.push(std::forward (args)...); cv_.notify_one(); } T pop()//阻塞 { std::unique_lock lk{ mtx_ }; cv_.wait(lk, [this] {return !q_.empty(); });//如果队列不为空就继续执行,否则阻塞 assert(!q_.empty()); T ret{ std::move_if_noexcept(q_.front()) }; q_.pop(); return ret; } std::optional try_pop()//非阻塞 { std::unique_lock lk{ mtx_ }; if (q_.empty())return {}; std::optional ret{ std::move_if_noexcept(q_.front()) }; q_.pop(); return ret; } bool empty()const { std::lock_guard lk{ mtx_ }; return q_.empty(); }private: Container q_; mutable std::mutex mtx_; std::condition_variable cv_;};#include int main(){ Queue q; std::thread t1( [&] { for (int i = 0; i < 100; ++i) { q.push(i); } }); std::thread t2( [&] { for (int i = 0; i < 100; ++i) { //std::cout< 有界队列
#include#include #include #include template class Queue{public: Queue(size_t capacity) :q_{ capacity }{} template void push(T&& val)//阻塞 { std::unique_lock lk{ mtx_ }; not_full_.wait(lk, [this] {return !q_.full(); }); assert(!q_.full()); q_.push_back(std::move(std::forward (val))); not_empty_.notify_one(); } template bool try_push(T&& val)//非阻塞 { std::lock_guard lk{ mtx_ }; if (q_.full())return false; q_.push_back(std::forward (val)); not_empty_.notify_one(); return true; } T pop()//阻塞 { std::unique_lock lk{ mtx_ }; not_empty_.wait(lk, [this] {return !q_.empty(); }); asert(!q_.empty()); T ret{ std::move_if_noexcept(q_.front()) }; q_.pop_front(); not_full_.notify_one(); return ret; } std::optional try_pop()//非阻塞 { std::lock_guard lk{ mtx_ }; if (q_.empty())return {}; std::optional ret{ std::move_if_noexcept(q_.front()) }; q_.pop_front(); not_full_.notify_one(); return ret; }private: boost::circular_buffer q_; std::mutex mtx_; std::condition_variable not_full_; std::condition_variable not_empty_;};#include int main(){ Queue q(10); std::thread t1( [&] { for (int i = 0; i < 100; ++i) { q.push(i); } }); std::thread t2( [&] { for (int i = 0; i < 100; ++i) { //std::cout< 关于"C++线程安全的队列是什么"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
阻塞
队列
篇文章
安全
线程
C++
更多
不错
实用
内容
拷贝
文章
知识
编译器
参考
帮助
有关
移动
编译
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库x
回头视频软件开发
购买一台服务器
中国网络安全市场格局
软件开发全屋定制
厦门红包软件开发
梦幻西游北京2区哪个服务器火
晋中网络技术市场报价
数据库中连接运算是什么
钉钉软件未连接到服务器
上海小鱼网络技术
风云社服务器满了
中国农业大学网络技术中心
数据库错误1063
软件开发应该看哪些英语
dns服务器 不可用
网络安全是it吗
贵州招聘软件开发人才
小学生网络安全教育比赛
维护网络安全主要靠技术
数据库与信息系统实验4
软件开发度量指标项
数据库次数
数据库有效验证码有哪些
mssql创建数据库
一年级小朋友网络安全知识画
科研院所中原网络安全研究院
最流行的数据库属于
软件开发经济成本分析报告
数据库设计专业好吗