Как оптимально реализовать блокировку, которая ставит в очередь доступ к определенной части данных? - PullRequest
0 голосов
/ 28 января 2012

Мое приложение ASP.NET предоставляет доступ к различным фрагментам данных.Доступ к каждому чанку может получить один или несколько пользователей одновременно, поэтому приложение должно предотвращать конфликты.

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

Я могу легко заставить все запросы обрабатывать один за другим, используя SyncLock следующим образом:

Private Shared AccessLock As New Object

 SyncLock AccessLock

 ..Do some reading and writing here

 End Synclock

Но это сильно ограничивает масштабируемость приложения.

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

Существует ли способ настроить синхронизацию для использования разных очередей для разных частей данных вместо одной очереди длявсе?Я имею в виду, что это может позволить мне вручную указать что-то вроде "SyncLock (" Group1 ") и" SyncLock ("Group2").

Ответы [ 2 ]

0 голосов
/ 28 января 2012

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

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

0 голосов
/ 28 января 2012

Есть ли способ настроить блокировку синхронизации, чтобы использовать разные очереди для разных частей данных вместо одной очереди для всего? Я имею в виду, что это может позволить мне вручную указать что-то вроде "SyncLock (" Group1 ") и" SyncLock ("Group2").

Да. У вас может быть два отдельных объекта и SyncLock для объекта "Group1" или объекта "Group2".

Однако я бы переосмыслил ваш дизайн. Возможно, вы захотите иметь одну или несколько ConcurrentQueue(Of T) коллекций для хранения ваших данных. Это потенциально позволит нескольким потокам обращаться к данным без блокировок, оставаясь при этом безопасным для потоков.

...