для простого указателя-приращения распределителя (у них есть официальное название?) Я ищу алгоритм блокировки. Это кажется тривиальным, но я хотел бы получить ответы о том, правильно ли выполнено мое приложение.блокировка свободного распределения распределительных устройств - правильно?
непоточно реализация:
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)
аргументами, возвращая первоначальное значение
Looks хорошо для меня - если другой поток распределяет между потоком-получателем и cmpxchg, цикл снова пытается. Любые комментарии?
Как вы освободите? – 2009-08-28 21:01:49
@Neil - Я видел такие модели раньше. Быстро выделите память с арены, как это для разных частей операции, и просто освободите все, когда закончите. – Michael
как сказал Майкл - вы только освобождаете кусок (голову) в целом. Идеально подходит для создания больших, неизменных/растущих структур данных. – peterchen