ev-spdlog-condvar-queue-not-full-002¶
| 字段 | 值 |
|---|---|
| 项目 | gabime/spdlog |
| 固定 commit | 79524ddd08a4 |
| 路径 | include/spdlog/details/mpmc_blocking_q.h |
| 行段 | L31-L38 |
| 特性 | std::condition_variable |
| 许可证 | MIT |
| 代码来源 | 项目源码 |
| 级别 | manual |
| 审核 | zyuhao7 @ 2026-11-03 |
| 测试代码 | 否 |
| 发现方式 | manual |
用法¶
用 condition_variable::wait 等待队列腾出空间
为什么典型¶
有界队列满时生产者必须阻塞;wait 的谓词检查 q_.full(),被唤醒后重新验证条件,避免虚假唤醒导致越界写入。
摘录¶
void enqueue(T &&item) {
{
std::unique_lock<std::mutex> lock(queue_mutex_);
pop_cv_.wait(lock, [this] { return !this->q_.full(); });
q_.push_back(std::move(item));
}
push_cv_.notify_one();
}
备注¶
生产头文件;等待与入队在同一把 unique_lock 保护下完成,锁在 notify 之前释放,避免唤醒者立刻又阻塞。