2014-01-13 1 views
3

Я пытаюсь оптимизировать библиотеку, в которой я использую хеш-таблицу с блокировкой. Один из способов сделать это - заменить эту блокирующую структуру без блокировки.Существует ли стоп-блокировка хэш-таблиц, которые сохраняют порядок вставки?

Я нашел некоторые алгоритмы о, и я решил реализовать в С помощью этой статьи: Split-ordered lists: lock-free extensible hash tables

Проблема заключается в том, что этот вид структуры не сохраняет порядок вставки элементов, и мне нужна эта функция для две причины:

1), чтобы получить следующий элемент к текущему (в соответствии с приказом вставки, а не в порядке hashkey),

2), чтобы заменить старые записи (новыми), когда максимальное число элементов в ht. Это потому, что я использую хеш-таблицу как буфер, и я хочу зафиксировать ее размер.

Итак, я прошу вас, все блокировки хеш-таблицы без блокировки страдают от этой проблемы с отсутствием вставки? Или есть решение?

+0

Если вы можете создать хеш-таблицу без блокировки, которая не сохраняет порядок вставки, и вы можете создать блокировку «прирастить этот счетчик», а затем на каждой вставке вы можете увеличить счетчик и сохранить пар и что по определению запоминает порядок. Возможно, ваш следующий вопрос: «... и как эффективно перечислять ключи в порядке ввода?» Не знаю; возможно, вы можете связать динамический массив, который сопоставляет индексы индекса вставки с ключами. Но у вас есть доказательство того, что ваш исходный вопрос имеет ответ «да». –

+0

Если вам нужно сохранить порядок вставки, то, возможно, хеш-таблица (без блокировки или иначе) не является правильной структурой данных. Простой связанный список, очередь или deque могут быть лучше. – twalberg

+0

Хэш-таблицы имеют свои приятные свойства, потому что они ** никогда не поддерживают порядок. –

ответ

1

Если память не является проблемой, простой способ ее реализации - использовать атомную ссылку. Изменения будут скопировать внутреннюю структуру данных, внести изменения и затем обновить ссылку.

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

Итак, вы платите с другим уровнем косвенности, но получаете очень простой способ обмена данными и алгоритмами.

Поскольку этот подход работает с любым алгоритмом, вы можете выбрать тот, который сохраняет порядок.

+0

Определенно это хорошее решение. Кстати, мне было интересно, есть ли улучшения в том, что я использую (без блокировки хэш-таблицы), не делая слишком много изменений. – MrMoog

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