単純なポインタインクリメントアロケータ(彼らは正式名称を持っていますか?)私はロックフリーのアルゴリズムを探しています。些細なことですが、私の実装が正しいかどうかについてのフィードバックを得たいと思います。ロックフリーアリーナアロケータ実装 - 正しい?
ないスレッドセーフな実装:
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;
}
スレッドセーフな実装での私の試み:CMPXCHG
は(destination, exchangeValue, comparand)
引数と比較連動交換は元の値に
ルックスを返し、ある
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;
}
他のスレッドがget-currentとcmpxchgの間に割り振った場合、ループは再び試みます。コメントはありますか?
どのように割り当てを解除しますか? –
@Neil - 前にこのようなパターンを見たことがあります。操作のさまざまな部分でこのようなアリーナから素早くメモリを割り当てて、終了したら全体を解放してください。 – Michael
マイケルは言った - あなたは全体としてチャンク(頭)の割り当てを解除します。大規模で不変の/成長専用のデータ構造を構築するのに最適です。 – peterchen