7

Tenemos el proyecto dirigido .NET 2.0 RTM (sí, debe ser .NET 2.0 RTM, tenemos algunos clientes ortodoxos). Y me pregunto cuáles son los inconvenientes de ReaderWriterLock? ¿Por qué es tan malo que todos digan "no lo use, intente usar algo más como la declaración lock"? Si pudiéramos usar .NET 3.5, definitivamente usaría ReaderWriterLockSlim, pero con ReaderWriterLock me da un poco de miedo que todas estas advertencias vengan de todas partes. ¿Alguien midió el rendimiento o lo que sea? Si hay algunos problemas de rendimiento, ¿bajo qué carga podemos encontrarlos?¿Cuáles son los verdaderos inconvenientes de usar ReaderWriterLock

Tenemos una situación clásica en términos de propósito principal de ReaderWriterLock, es decir, lectura múltiple y rara vez se escribe. Usar la instrucción lock bloquearía a todos los lectores. Tal vez no sea un problema terrible para nosotros, pero si pudiera usar ReaderWriterLock estaría más satisfecho. IMO presentando varios monitores es una muy mala idea.

Respuesta

1

Si realmente está enfrentando el caso de uso ideal para ReaderWriterLock (es decir, muchas lecturas concurrentes y pocas escrituras) ¡entonces úsala!

Si le parece que es demasiado lento, hay alternativas. Sanjeevakumar proporcionó algunos enlaces en su respuesta. Voy a ofrecer una en la mía también:
Low-Lock Techniques in action: Implementing a Reader-Writer lock

citaré la comida para llevar desde ese enlace aquí:

  1. utilizar bloqueos lector-grabador como se sugiere en mi primer artículo. Si el bloqueo de perforación es un problema, tome la implementación aquí como un reemplazo 'drop in' para .NET System.ReaderWriterLock. Siéntase libre de usar esta implementación hasta que Microsoft corrija la versión en su biblioteca.
  2. Los cerrojos giratorios son una técnica muy valiosa de bloqueo bajo. Aquí se usaron para crear un bloqueo de lector-escritor limpio, simple pero eficiente, escrito de manera completa en el código administrado. Este bloqueo es significativamente más simple que la mayoría de las implementaciones que he visto, pero aún es óptimo. La razón de esto es que el uso de bloqueos por giro simplifica enormemente el diseño y el análisis del bloqueo, sin sacrificar el rendimiento. Siéntase libre de usar la demostración de implementación de bloqueo de Spin aquí para realizar otras construcciones simultáneas de alto rendimiento.
  3. Incluso algo tan simple como un bloqueo Reader-Writer tiene sutilezas sobre su comportamiento (especialmente cuando se tiene en cuenta el rendimiento). Mantenerlo simple realmente vale la pena aquí.
+0

Bueno, no estoy muy seguro de que sea un caso ideal. No tenemos muchos hilos simultáneamente leyendo y escribiendo desde recursos compartidos. Quiero decir que no tenemos 100 o 200 o 500 hilos, se trata de 15-20 hilos. Trataré de ir con una simple declaración 'lock' y si enfrentamos el problema de múltiples bloqueos, intentaré usar' ReaderWriterLock' o buscaré alternativas. –

Cuestiones relacionadas