ReaderWriterLockSlim с LockRecursionPolicy.SupportsRecursion против блокировки - PullRequest
0 голосов
/ 08 февраля 2019

Меня смущает предупреждение для ReaderWriterLockSlim SupportsRecursion

От MSDN

По умолчанию новые экземпляры ReaderWriterLockSlim создаются с помощьюLockRecursionPolicy.NoRecursion флаг и не разрешать рекурсию.Эта политика по умолчанию рекомендуется для всех новых разработок, потому что рекурсия вносит ненужные сложности и делает ваш код более подверженным тупикам.

Чего я не понимаю, так почему это предупреждение не применяется к встроенному lock рекурсивному выражению?

1 Ответ

0 голосов
/ 08 февраля 2019

Как объяснено здесь , ключевое слово lock в C # основано на Monitor объекте, эксклюзивном механизме синхронизации.«Исключительно» означает, что, когда первый поток входит в критическую секцию, все последующие потоки блокируются .

ReaderWriterLockSlim, с другой стороны, различает блокировки считывателя и блокиратор записи. Они предназначены для использования (и обеспечивают улучшенный параллелизм) в сценариях, где много читателей, но только случайные обновления записи.Блокировки Reader / Writer неисключительны.

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

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

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

Дальнейшее чтение
Основы синхронизации: Блокировка
Продвинутые потоки: блокировки чтения / записи
Почему рекурсия блокировки вообще плохая идея в любом случае

...