1

给定以下我制作的简单无锁​​线性分配算法:

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

任何想法?

4

0 回答 0