Упорядоченный шаблон блокировки и ReaderWriterLock в C # - PullRequest
0 голосов
/ 20 января 2011

Предотвращает ли упорядоченный шаблон блокировки взаимоблокировки при использовании с ReaderWriterLock (или ReaderWriterLockSlim)?

Очевидно, что шаблон предотвращает взаимные блокировки с мьютексом.Предотвращает ли это взаимную блокировку, если я блокирую несколько ресурсов ((N ресурсов с блокировками чтения) и (1 или 2 ресурса с блокировками записи)).

Например: (Жирные цифры представляют ресурсы с блокировками записи)

1 2 3 4 5

2 3 4

1 4 5

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

tl; dr Упорядочение ресурсов предотвращает взаимоблокировку и для блокировок чтения-записи.

Длинный ответ:

Нарисуйте график ожидания следующим образом:

Сначала нарисуйте вершину для всех ресурсов слева направо в установленный порядок.

Затем для каждого процесса, ожидающего ресурса, нарисуйте вершину, непосредственно перед вершиной ожидаемого ресурса. Если процесс не ожидает каких-либо ресурсов, нарисуйте вершину в дальнем правом углу после всех вершин ресурса.

Затем проведите грань от каждого процесса до ресурса, на котором это процесс ожидает и отрисовывает грань от каждого ресурса до процесс, который в настоящее время содержит этот ресурс.

Рассмотрим каждое ребро на графике. Есть два случая:

  • край равен Pi -> Ri, то есть от процесса к ресурсу. Так как каждый Процесс ожидает только на одном ресурсе, и мы нарисовали обрабатывать вершину непосредственно слева от ресурса в ожидании, то край слева направо.

  • край равен Ri -> Pj, т.е. от ресурса к процессу. Если Pj не дожидаясь какого-либо ресурса, его вершина находится справа от все ресурсы, поэтому край слева направо. Если Pj ожидает Rk, затем i < k, потому что процессы получают ресурсы в порядок. Если i < k, то Ri слева от Rk и Pj сразу слева от Rk (так как мы нарисовали графику таким образом), следовательно, Ri слева от Pj, поэтому край снова остается правый.

Поскольку все ребра графика, построенные таким образом, расположены слева направо Хорошо, тогда мы построили топологическую сортировку графа, следовательно, в графике нет циклов, следовательно, тупик не может возникнуть.

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

0 голосов
/ 19 марта 2013

Я попытался реализовать упорядоченную блокировку в C #, которая проверяет, были ли блокировки получены в фиксированном порядке.Смотри http://www.codeproject.com/Tips/563154/OrderedLock-in-Csharp

0 голосов
/ 20 января 2011

Я думаю, что вы делаете неправильный шаблон блокировки Ordered, вам нужно захватить все блокировки по порядку.Чтобы получить блокировку записи для «4», вам нужно сначала захватить блокировку записи для «3».Для «5» вам нужно захватить блокировки записи для «3» и «4» и «5».

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

Еще лучше, если попытаться отделить ваш код, чтобы вам не требовалась упорядоченная блокировка (т. Е. Чтобы мне не требовался доступ к данным из «3» и «4» одновременно).Это не всегда возможно, но ваш код будет тем проще, чем больше вы сможете это сделать.

...