Für eine einfache Zeiger-Inkrement-Allokator (haben sie einen offiziellen Namen?) Ich bin für eine Sperre-freien Algorithmus suchen. Es scheint trivial zu sein, aber ich würde gerne ein paar Rückmeldungen bekommen, ob meine Implementierung korrekt ist.
nicht thread-sichere Implementierung:
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;
}
Mein Versuch einer thread-sicheren Implementierung:
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;
}
wobei CMPXCHG
ist eine verschränkte Vergleichsbörse mit (destination, exchangeValue, comparand)
Argumente und gibt den ursprünglichen Wert zurück
Sieht für mich gut aus - wenn ein anderer Thread zwischen get-current und cmpxchg zuweist, versucht die Schleife erneut. Irgendwelche Kommentare?