Блокировка свободной хэш-таблицы для C # - PullRequest
4 голосов
/ 11 июня 2009

Кто-нибудь знает о реализации хэш-таблицы без блокировки в C #? Или кто-нибудь может подтвердить факт, что по крайней мере чтение в HashTable поточно-ориентировано?

Edit:

Я могу прочитать документацию, но неясно.

"Потокобезопасен для многопоточного использования, когда только один из потоков выполняет операции записи (обновления)."

Итак, вопрос в том, что если бы у меня было несколько потоков, и все они могли бы записать в хеш-таблицу, я бы использовал блокировку записи. Тем не менее, те же темы читаются и из хеш-таблицы. Нужна ли читалка на чтение?

Ответы [ 6 ]

5 голосов
/ 11 июня 2009

Чтения являются потокобезопасными, пока коллекция не будет изменена.

3 голосов
/ 28 декабря 2011

Теперь я могу ответить на первую часть этого вопроса:

Кто-нибудь знает о реализации хэш-таблицы без блокировки в C #?

Только что выпустил альфа-версию одного:

https://github.com/hackcraft/HackCraft.LockFree

У меня есть один на https://bitbucket.org/JonHanna/ariadne и https://github.com/hackcraft/Ariadne

3 голосов
/ 11 июня 2009

Из документации :

Hashtable является потокобезопасным для использования несколько тем читателя и один написание темы. Это потокобезопасный для многопоточное использование, когда только один из темы выполняют запись (обновление) операции, которые позволяют без блокировки читает при условии, что авторы сериализовано в Hashtable. к поддержка нескольких писателей все операции на Hashtable должны быть сделано через обертку, возвращенную Синхронизированный метод, при условии, что нет тем, читающих Hashtable объект.

Перечисление через коллекцию по сути не безопасен процедура. Даже когда коллекция синхронизированы, другие потоки все еще могут изменить коллекцию, которая вызывает перечислитель для исключения. Чтобы гарантировать безопасность нити во время перечисление, вы можете заблокировать Коллекция в течение всего Перечисление или ловить исключения в результате изменений, сделанных другими резьб.

2 голосов
/ 12 июня 2009

Кроме того .NET 4.0 добавляет ConcurrentDictionary в пространство имен System.Collections.Concurrent ...

1 голос
/ 11 июня 2009

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

В противном случае я бы рекомендовал использовать ReaderWriterLockSlim (если вы читаете больше, чем пишете) или Monitor (оператор блокировки), если вы пишете много.

0 голосов
/ 11 июня 2009

Возможно, вы захотите использовать вашу хеш-таблицу вместе с ReaderWriterLock из-за того, что сказал Орион.

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