【发布时间】:2019-01-31 11:39:23
【问题描述】:
我需要一个线程安全的队列,如果它不为空则产生数据,并等待数据到达。超时。我有这样的
void ThreadsafeQueue::enqueue(data_t& data)
{
std::lock_guard<std::mutex> lock(m_mutex);
m_queue.push(data);
m_condvar.notify_one();
}
boost::optional<data_t> ThreadsafeQueue::dequeue()
{
std::unique_lock<std::mutex> lock(m_mutex);
const std::chrono::seconds DEFAULT_DELAY(10);
if ((!m_queue.empty()) || m_condvar.wait_for(lock, DEFAULT_DELAY) == std::cv_status::no_timeout)
{
const auto data = m_queue.front();
m_queue.pop();
return data;
}
return boost::none;
}
但是,由于某种原因,有时它有时会进入带有 no_timeout 的 if 语句,而实际上它并没有得到通知。并尝试在空队列上使用 front()。
我做错了吗?
【问题讨论】:
-
这是一个经常被问到的重复问题。
-
This
wait_forreference 表示可以虚假返回。