Perl темы и хэш-ключи - PullRequest
       3

Perl темы и хэш-ключи

3 голосов
/ 27 сентября 2011

Если у хэша есть общий ресурс для двух потоков, и я гарантирую, что thread1 просто взаимодействует с key1 и thread2 только с key2, могу ли я считать его безопасным для потоков? Если это так, нужно ли создавать key1 и key2 перед тем, как делиться хешем по ступеням, или каждый поток может создать свой собственный ключ? Есть ли место, где я могу получить информацию о внутренних механизмах Perl-хэшей и их поведении с потоками?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Хеш - это массив связанных списков. Функция хеширования преобразует ключ в число, которое используется в качестве индекса элемента массива («корзины»), в который сохраняется значение. Несколько ключей могут хэшировать к одному и тому же индексу («коллизия»), поэтому связанные списки обрабатывают этот случай.

Если поток изменяет один из связанных списков (например, для добавления элемента), пока другой перемещается по нему (например, для извлечения элемента), это может привести к проблемам.

Добавление элементов небезопасно. Вы можете решить эту проблему, предварительно создав элементы хеша (или массива).

Таким образом, остается вопрос о том, является ли доступ к существующим элементам безопасным или нет. Возможно, но это не гарантируется.

Вы можете найти эти интересные:

  • illguts подробно описывает внутренние структуры данных Perl.
  • Devel :: Peek - очень полезный инструмент.
0 голосов
/ 27 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...