锁定自由竞技场分配器执行 - 正确的吗?(lock free arena allocator imp

2019-08-03 00:55发布

一个简单的指针增量分配器(他们有一个正式的名字吗?)我找了一个无锁算法。 这似乎微不足道,但我想获得SOEM反馈我implementaiton是否正确。

不是线程安全的实现:

byte * head;  // current head of remaining buffer
byte * end;   // end of remaining buffer

void * Alloc(size_t size)
{
   if (end-head < size)
     return 0; // allocation failure

   void * result = head;
   head += size;
   return head;
}

我在一个线程安全的实现尝试:

void * Alloc(size_t size)
{
  byte * current;
  do 
  {
     current = head;
     if (end - current < size)
        return 0;  // allocation failure
  } while (CMPXCHG(&head, current+size, current) != current));
  return current;
}

其中CMPXCHG是具有互锁比较交换(destination, exchangeValue, comparand)的参数,并返回原来的值

对我来说很好 - 如果另一个线程获取电流和CMPXCHG之间分配,循环再次尝试。 任何意见?

Answer 1:

您当前的代码似乎工作。 您的代码的行为与下面的代码,这是一个简单的模式,您可以使用用于实现对数据的任何一个字的运行不需要副作用的无锁算法

do
{
    original = *data; // Capture.

    result = DoOperation(original); // Attempt operation
} while (CMPXCHG(data, result, original) != original);

编辑:我原来的互锁附加的建议将不太在这里工作,因为您的支持试图分配的,如果保留空间不够失败。 你已经修改指针,从而导致如果使用InterlockedAdd随后allocs失败。



文章来源: lock free arena allocator implementation - correct?