Подтвердить что ты не робот

ReaderWriterLock vs lock {}

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

4b9b3361

Ответ 1

lock позволяет только одному потоку выполнять код одновременно. ReaderWriterLock может разрешать одновременное чтение нескольких потоков или иметь эксклюзивный доступ для записи, поэтому он может быть более эффективным. Если вы используете .NET 3.5 ReaderWriterLockSlim, это еще быстрее. Поэтому, если ваш общий ресурс читается чаще, чем написание, используйте ReaderWriterLockSlim. Хорошим примером его использования является файл, который вы читаете очень часто (по каждому запросу), и вы редко обновляете содержимое файла. Поэтому, когда вы читаете из файла, вы вводите блокировку чтения, чтобы многие запросы могли открыть ее для чтения, и когда вы решите написать, вы введете блокировку записи. Использование lock в файле в основном означает, что вы можете одновременно обслуживать один запрос.

Ответ 2

Рассмотрите возможность использования ReaderWriterLock, если у вас есть много потоков, которые < должны читать данные, и эти потоки блокируются в ожидании блокировки, и вам не часто нужно измените данные.

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

Поэтому используйте только ReaderWriterLock после того, как у вас подтверждено, вы получите высокий конфликт для блокировки в реальной жизни ", и вы подтвердили, что не можете переработайте свой дизайн блокировки до , чтобы уменьшить время блокировки для.

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

В некоторых случаях вы также можете использовать кеш Apsnet для обработки общих данных и просто удалять элемент из кеша при изменении данных. Следующее чтение может поместить новую копию в кеш.

Запомнить

"Лучший вид блокировки - это блокировка вам не нужна (т.е. не обмениваться данными между потоками).

Ответ 3

Мониторинг и базовый "syncblock", который может быть связан с любым ссылочным объектом -— основной механизм в С# lock — поддерживает исключительное выполнение. Только один поток может иметь замок. Это просто и эффективно.

ReaderWriterLock (или, в V3.5, лучший ReaderWriterLockSlim) обеспечивает более сложную модель. Избегайте, если вы не знаете, что это будет более эффективно (т.е. Проводить измерения производительности, чтобы поддерживать себя).

Лучший вид блокировки - это блокировка, которая вам не нужна (т.е. не обмениваться данными между потоками).

Ответ 4

ReaderWriterLock/Slim специально разработан, чтобы помочь вам эффективно блокировать множественный сценарий потребления/одиночного производителя. Выполнение этого с помощью оператора блокировки возможно, но неэффективно. RWL/S получает преимущество, будучи способным к агрессивной спин-блокировке для получения блокировки. Это также помогает избежать блокировки конвоев, проблема с оператором блокировки, когда нить отказывается от кванта потока, когда он не может получить блокировку, заставляя ее отстать, потому что она не будет перенесена на некоторое время.

Ответ 5

ReaderWriterLock позволяет вам иметь несколько потоков, удерживая ReadLock одновременно, чтобы ваши общие данные могли потребляться сразу несколькими потоками. Как только запрашивается WriteLock, больше не предоставляется ReadLocks, а код, ожидающий WriteLock, блокируется до тех пор, пока все потоки с ReadLocks не выпустят их.

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

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

ReaderWriterLockSlim - это новая более совершенная версия ReaderWriterLock с лучшей поддержкой рекурсии и возможностью беспрепятственного перемещения потока из блокировки, которая по существу является ReadLock для WriteLock (UpgradeableReadLock).

Ответ 6

Верно, что ReaderWriterLockSlim является FASTER, чем ReaderWriterLock. Но потребление памяти ReaderWriterLockSlim абсолютно возмутительно. Попробуйте подключить профилировщик памяти и убедитесь сами. Я бы выбрал ReaderWriterLock в течение дня через ReaderWriterLockSlim.

Ответ 7

Я бы предложил посмотреть http://www.albahari.com/threading/ - часть третья говорит о ReaderWriterLockSlim (которую вы хотите использовать вместо ReaderWriterLock).