c++ - 线程安全队列实现: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();
会复制数据。有没有办法避免复制?还是我误解了什么?
解决方案
只有一种方法可以避免复制,如果您移动此对象然后返回它。因为即使您可以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;
}
推荐阅读
- mongodb - 匹配数组中的两个元素
- reactjs - 这是高阶组件的正确示例吗?
- node.js - 在 NodeJS Web 应用程序中使用字典保存关键字的最佳方法是什么?
- android - 如何在 Flutter 上设置自定义高程颜色?
- python-3.x - 如果我使用亚当优化,模型的权重何时更新?
- java - 使用 Files.walk sun.nio.fs.UnixException 时权限被拒绝
- mysql - MySQL:带有连接子选择的范围之间的日期列表
- reactjs - Antd Date:如何在时刻 js 中设置有效的空日期
- macos - 错误:命令“gcc”失败,退出状态为 1 -Python3.7 MacOs Catalina
- c# - 如何编写代码来实现这些任务?