C++轻量线程安全消息队列基于std::queue+mutex+condition_variable实现阻塞式生产者-消费者模型,支持模板泛型、移动语义、超时尝试及容量限制,兼顾解耦与健壮性。
用C++实现一个轻量、线程安全的消息队列,核心在于封装好生产者-消费者模型的同步逻辑,不依赖外部中间件,就能在模块间实现解耦。关键不是堆功能,而是把阻塞、通知、类型泛化这三点做稳。
不需要第三方库,C++11的std::queue + std::mutex + std::condition_variable就足够。重点是让Pop操作能自动等待——队列空时不忙等,而是挂起线程,等Push发来通知再唤醒。
std::unique_lock<:mutex>保护所有队列读写操作cv.wait(lock, []{ return !q
.empty(); }),条件成立才继续cv.notify_one(),只唤醒一个等待中的消费者把队列定义成模板类,比如template,这样既能传int、std::string,也能传自定义结构体或智能指针,避免强制类型转换和内存管理混乱。
_queue.push(std::move(msg))减少拷贝开销bool表示是否成功取到,配合引用参数输出值,避免异常路径下的资源泄漏TryPop(T&, int timeout_ms = 0)支持带超时的非阻塞尝试消息队列真正发挥价值的地方,是让两个原本紧耦合的模块变成“只认接口、不见对方”。比如日志模块不再直接调用文件写入函数,而是往队列里扔一条LogEntry;另一个独立线程从队列取日志、批量落盘。
queue.Push(log),不用管谁消费、何时消费、失败怎么重试简单不等于简陋。几个容易忽略但影响稳定性的点:
max_size = 1024),Push前检查,满则阻塞或丢弃/告警,防内存无限增长Close()接口标记队列关闭,Pop检测到后主动退出循环,便于优雅停机