5 Stimmen

lock free arena allocator implementation - korrekt?

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?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X