如何解决将无锁线性分配改进为无等待
给定以下简单的无锁线性分配算法:
bool allocate(size_type size,size_type& offset)
{
size_type pos;
size_type new_pos;
pos = m_pos.load(std::memory_order_acquire);
do
{
new_pos = pos + size;
if (new_pos > m_end)
return false;
}
while (!m_pos.compare_exchange_weak(pos,new_pos,std::memory_order_acq_rel,std::memory_order_acquire));
offset = pos;
return true;
}
我想进一步改进它以在快速路径上免等待,完全丢弃 CAS 循环,最好使用 fetch_add
,但是我不确定分配失败时如何处理这种情况因为请求的大小大于可用的大小 - 当检测到这一点时,fetch_add
已经增加了现在超过有效范围的位置,其他线程可能同时加载,这将进一步增加它并有没有分配空间的错误错觉。在此路径中仍然需要某种自旋等待循环,但是我无法提出有效的解决方案。
有什么想法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。