2009-08-28 9 views
3

単純なポインタインクリメントアロケータ(彼らは正式名称を持っていますか?)私はロックフリーのアルゴリズムを探しています。些細なことですが、私の実装が正しいかどうかについてのフィードバックを得たいと思います。ロックフリーアリーナアロケータ実装 - 正しい?

ないスレッドセーフな実装:

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の間に割り振った場合、ループは再び試みます。コメントはありますか?

+0

どのように割り当てを解除しますか? –

+0

@Neil - 前にこのようなパターンを見たことがあります。操作のさまざまな部分でこのようなアリーナから素早くメモリを割り当てて、終了したら全体を解放してください。 – Michael

+0

マイケルは言った - あなたは全体としてチャンク(頭)の割り当てを解除します。大規模で不変の/成長専用のデータ構造を構築するのに最適です。 – peterchen

答えて

2

現在のコードが正常に動作しているようです。あなたのコードは、あなたが

do 
{ 
    original = *data; // Capture. 

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

EDIT副作用なしにデータの単一の単語で動作する任意のロックフリーアルゴリズムを実装するために使用できる単純なパターンで以下のコードと同じ動作します。私のオリジナルの提案をあなたが十分なスペースが残っていなければ、割り当てようと失敗することをサポートしているので、インターロッキングされたアドインはここではうまくいきません。 InterlockedAddを使用した場合、ポインタを修正して以降のallocを失敗させてしまいました。

関連する問題