给定以下我制作的简单无锁线性分配算法:
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
已经增加了现在超过有效范围的位置,该有效范围可能由其他线程同时加载,这将进一步增加它并产生没有分配空间的错误错觉。这条路径仍然需要某种自旋等待循环,但是我想不出一个有效的解决方案。
任何想法?