首页 > 解决方案 > 线程安全队列实现:pop() 的高效实现

问题描述

我正在尝试实现队列的线程安全版本,并在实现 pop() 的包装器时遇到问题。参考下面的代码。由于限制,无法粘贴整个代码。

bool internal_pop_front_no_lock(T& item)
{
    bool isDataAvailable = false;

    if (!m_Queue.empty())
    {
        item = m_Queue.front();
        m_Queue.pop();
        isDataAvailable = true;
    }

   return isDataAvailable;
}

现在我觉得行item = m_Queue.front();会复制数据。有没有办法避免复制?还是我误解了什么?

标签: c++c++11queue

解决方案


只有一种方法可以避免复制,如果您移动此对象然后返回它。因为即使您可以m_Queue.front()在不复制的情况下访问,一旦您这样做,m_Queue.pop();该对象就会被销毁,如果您需要在此之后访问该对象,则需要复制或移动该对象。所以像这样的事情是你唯一的机会:

std::optional<T> internal_pop_front_no_lock()
{
    std::optional<T> result;

    if (!m_Queue.empty())
    {
        result = std::move(m_Queue.front());
        m_Queue.pop();
    }

   return result;
}

推荐阅读