std::queue在c++26及所有现有标准中均非线程安全,标准委员会明确拒绝为其添加并发语义,因其策略高度依赖场景;实际应用需自行组合mutex或选用moodycamel/boost等成熟第三方实现。

std::queue 不是并发安全的,标准库不提供线程安全版本
直接说结论:std::queue 在 C++26(以及所有现有标准)中仍不是线程安全的——它没有内置锁、没有 const 重载的 front()/back() 的原子读取、也没有 try_pop() 这类无锁接口。标准委员会明确拒绝将并发语义加入 std::queue,理由是:并发策略太依赖场景(阻塞/非阻塞/有界/无界/内存序),强行标准化反而会限制实现。
想用“并发队列”,得自己组合或选第三方
标准库没给,但你可以基于已有组件搭一个轻量可用的:
-
std::queue+std::mutex是最直白的做法,适合吞吐不高、逻辑简单的场景;注意必须把front()和pop()放在同一个锁区内,否则竞态(front()返回后队列被另一线程清空,再pop()就 UB) - 若要避免拷贝、支持移动语义,别用
front()+pop()分两步,改用带输出参数的try_pop(T&)模式,内部先front()再pop() - C++26 引入了
std::atomic_ref和更细粒度的std::memory_order控制,但依然不构成完整队列抽象;别指望靠它们“手写 lock-free queue”——除非你真懂 ABA 问题和内存屏障配对 - 生产环境建议用
moodycamel::ConcurrentQueue或boost::lockfree::queue,它们已处理好缓存行对齐、虚假共享、内存序边界等细节
为什么 std::queue 不能简单加个 mutex 成员?
因为标准容器设计契约不允许隐藏同步开销:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 所有
std::queue成员函数(包括empty())都声明为noexcept,而加锁可能抛std::system_error(如资源不足) -
std::queue是适配器,底层是std::deque(默认)或std::list;这些容器本身不保证并发读安全——即使只读size(),也可能因 resize 触发内部指针更新,造成数据竞争 - 如果封装成
thread_safe_queue<t></t>类,front()返回引用,但该引用在线程间传递后,原队列可能已被修改,悬垂风险比单线程还高
C++26 也没加 std::sync_queue 或类似名字
查过最新草案(N4981 及后续修订):std::queue 接口无变更;<syncstream></syncstream> 被加入,但那是针对 I/O 的;<latch></latch>/<semaphore></semaphore> 扩展了同步原语,但没绑定到容器。
所以别等标准“添加”——标准库的哲学是提供可组合的积木,而不是打包好的解决方案。真正卡住的往往不是“有没有”,而是“怎么让 pop 不阻塞主线程又不忙等”,这得看你的调度模型,不是加个 std::mutex 就能闭环的。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










