首页app软件阻塞队列源码 阻塞队列 线程安全

阻塞队列源码 阻塞队列 线程安全

圆圆2025-10-18 01:00:11次浏览条评论

答案是使用互斥锁、条件标记和队列实现线程安全的阻塞队列,通过加锁和条件等待保证push和pop操作在多线程下的正确性,支持阻塞与唤醒机制。

c++中如何实现一个阻塞队列_c++线程安全阻塞队列的设计思路

在C中实现一个线程安全的阻塞队列,核心是结合互斥锁(std::mutex)、条件标记(std::condition_variable)和一个底层容器(如std::queue)。阻塞队列的特点是:当队列为空时,出队操作会阻塞;当队列满时(如果有容量限制),入队操作也阻塞。基本设计思路

支持队列需要满足多线程环境下安全地进行push和pop操作。主要依赖以下机制:std::mutex:保护共享数据(队列),防止多个线程同时访问导致数据竞争。 std::condition_variable:用于线程间通信,使等待的线程在条件满足时被唤醒。 std::queue:作为内部存储结构。 关键操作逻辑

两个核心成员函数是push和pop,它们都需要加锁,并在特定条件下等待。

push(value)操作流程:

立即学习“C免费学习笔记(深入)”;获取互斥锁。如果队列已满(设置了最大队列),则等待not_full条件标记。元素加入队列。可能正在等待的pop线程(通过notify_one或notify_all)。释放锁定。

pop() -gt;价值操作流程:boardmix博思白板

boardmix博思白板,一个点燃团队协作并激发创意的空间,集aigc,一键PPT,表达思维导图,笔记多个文档创意能力于一体,将团队工作效率提升到新的层次。39查看详情互相获取解除锁定。如果队列为空,等待 not_empty 条件变量。 取出队首元素并移除。 通知可能正在等待的推送 线程。返回提取的值。

C 代码代码

下面是一个简单的线程安全阻塞队列实现:#include lt;queuegt;#include lt;mutexgt;#include lt;condition_variablegt;#include lt;threadgt;template lt;typename Tgt;class BlockingQueue {private: std::queuelt;Tgt;queue_; std::mutex mtx_; std::condition_variable not_empty_; std::condition_variable not_full_; size_t max_size_;public: 显式 BlockingQueue(size_t max_size = SIZE_MAX) : max_size_(max_size) {} void push(const Tamp; item) { std::unique_locklt;std::mutexgt; lock(mtx_); not_full_.wait(lock, [this] { return queue_.size() lt; max_size_; }); queue_.push(item); not_empty_.notify_one(); } T pop() { std::unique_locklt;std::mutexgt; lock(mtx_); not_empty_.wait(lock, [this] { return !queue_.empty(); }); T item = std::move(queue_.front());queue_.pop(); not_full_.notify_one(); 返回 item; } boolempty() const { std::lock_guardlt;std::mutexgt; lock(mtx_); returnqueue_.empty(); } size_t size() const { std::lock_guardlt;std::mutexgt; lock(mtx_); returnqueue_.size(); }};登录后复制

使用示例:BlockingQueuelt;intgt; bq(5);std::线程生产者([amp;]() { for (int i = 0; i lt; 10; i) { bq.push(i); std::cout lt;lt; quot;生产: quot; lt;lt; i lt;lt; quot;\nquot;; }});std::线程消费者([amp;]() { for (int i = 0; i lt; 10; i) {

int val = bq.pop(); std::cout lt;lt; quot;Consumed: quot; lt;lt; val lt;lt; quot;\nquot;; }});生产者.join();consumer.join();登录后复制注意事项与优化点

实际使用中还需要考虑一些细节:支持移动语义:使用 Tamp;amp;重载推送可提升性能。超时操作:提供 try_push / try_pop 带超时版本,使用 wait_for 或 wait_until。关闭机制:添加 shutdown 标志,使等待线程能优雅退出。notify_all vs notify_one:notify_one 更高效,适用于一对一生产;notify_all 广播适合场景。基本上就这些。只要掌握互斥锁和条件信号的配合使用,就可以写出可靠的支撑队列。

以上就是c中如何实现一个阻塞队列_c 线程安全阻塞队列的设计思路的详细内容,更多请关注乐哥常识网其他文章相关! 相关标签: c ai 多线程成员函数大家都看: c 中如何设置cout输出浮点数的精度_c cout浮点数报表输出方法 什么是数据库的包含索引?在C#中如何设计包含列?如何调用python脚本_c调用Python脚本方法

c++中如何实现一个
php在重写方法时有哪些注意事项 php函数重构
相关内容
发表评论

游客 回复需填写必要信息