c – 锁定免费竞技场分配器实现 – 对吗?

对于一个简单的指针增量分配器(他们有一个正式名称?)我正在寻找一个无锁算法.这似乎微不足道,但我想得到soem反馈,我的实现是否正确.

不是线程安全的实现:

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)参数的互锁比较交换,返回原始值

对我来说很好看 – 如果另一个线程在get-current和cmpxchg之间分配,则循环再次尝试.任何意见?

最佳答案 您当前的代码似乎有效.您的代码与下面的代码行为相同,这是一个简单的模式,您可以使用它来实现任何无锁算法,该算法对单个数据字进行操作而没有副作用

do
{
    original = *data; // Capture.

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

编辑:我原来建议的互锁添加在这里不会有用,因为你支持尝试分配和失败,如果没有足够的空间.如果使用InterlockedAdd,您已经修改了指针并导致后续分配失败.

点赞