对于一个简单的指针增量分配器(他们有正式名称?)我正在寻找一个无锁算法。这似乎微不足道,但我想得到反馈是否我的实施是正确的。
不是线程安全实现:
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之间分配,则循环再次尝试。有什么意见吗?
答案 0 :(得分:2)
您当前的代码似乎有效。您的代码与下面的代码行为相同,这是一个简单的模式,您可以使用它来实现任何无锁算法,该算法对没有副作用的单个数据字进行操作
do
{
original = *data; // Capture.
result = DoOperation(original); // Attempt operation
} while (CMPXCHG(data, result, original) != original);
编辑:我对互锁添加的原始建议在这里不会起作用,因为如果没有足够的空间,你支持尝试分配和失败。如果您使用InterlockedAdd,则已经修改了指针并导致后续分配失败。