能,但必须手动加锁和条件等待;所有queue操作需同一unique_lock保护,用condition_variable::wait带谓词避免虚假唤醒;优先选mutex+condition_variable保障跨平台兼容性。
std::queue 配合 std::mutex 和 std::condition_variable 能否安全用于生产者消费者?
能,但必须手动加锁和条件等待,std::queue 本身不是线程安全的。常见错误是只锁 push 或只锁 pop,漏掉对 empty() 的保护——这会导致竞态:一个线程刚检查 q.empty() == false,另一个线程立刻 pop 到空,前一线程再 front() 就未定义行为。
实操建议:
- 所有访问
std::queue的操作(empty()、front()、pop()、push())必须包裹在同一个std::unique_lock中 - 用
std::condition_variable::wait()等待非空或非满,**必须传入带谓词的 lambda**,避免虚假唤醒,例如:cv.wait(lock, [&q]{ return !q.empty(); }); - 不要用
notify_one()替代notify_all()除非你确定只有一个消费者在等——多个消费者时漏通知会导致死锁
为什么不用 std::semaphore(C++20)而选 condition_variable?
std::semaphore 理论上更贴近信号量语义,但实际受限于编译器支持和运行时兼容性:MSVC 19.3x 对 std::binary_semaphore 的实现有已知唤醒丢失 bug;Clang/libc++ 在 macOS 上尚未完全支持;GCC 12+ 虽支持,但需链接 -lpthread 且部分嵌入式 STL 无此特性。而 std::condition_variable 是 C++11 就稳定可用的方案。
使用场景差异:
立即学习“C++免费学习笔记(深入)”;