2009-08-28 2 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; 
} 

Моя попытка потокобезопасная реализации:

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, цикл снова пытается. Любые комментарии?

+0

Как вы освободите? – 2009-08-28 21:01:49

+0

@Neil - Я видел такие модели раньше. Быстро выделите память с арены, как это для разных частей операции, и просто освободите все, когда закончите. – Michael

+0

как сказал Майкл - вы только освобождаете кусок (голову) в целом. Идеально подходит для создания больших, неизменных/растущих структур данных. – peterchen

ответ

2

Ваш текущий код работает. Ваш код ведет себя так же, как и приведенный ниже код, который представляет собой простой шаблон, который вы можете использовать для реализации любого безблокировочного алгоритма, который работает на одном слове данных без побочных эффектов

do 
{ 
    original = *data; // Capture. 

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

EDIT: Мое оригинальное предложение взаимосвязанного add не будет работать здесь, потому что вы поддерживаете попытки выделить и провалиться, если осталось недостаточно свободного места. Вы уже изменили указатель и вызывают последующие выделения, если вы использовали InterlockedAdd.

 Смежные вопросы

  • Нет связанных вопросов^_^