Bloqueos SRW (bloqueos finos de lector/escritor)

Los bloqueos delgados de lector/escritor (SRW) permiten que los subprocesos de un único proceso accedan a los recursos compartidos; están optimizados para velocidad y ocupan muy poca memoria. Los bloqueos slim reader-writer no se pueden compartir entre procesos.

Los subprocesos de lector leen datos de un recurso compartido, mientras que los subprocesos de escritura escriben datos en un recurso compartido. Cuando varios subprocesos están leyendo y escribiendo mediante un recurso compartido, los bloqueos exclusivos, como una sección crítica o una exclusión mutua, pueden convertirse en un cuello de botella si los subprocesos del lector se ejecutan continuamente, pero las operaciones de escritura son poco frecuentes.

Los bloqueos SRW proporcionan dos modos en los que los subprocesos pueden acceder a un recurso compartido:

  • Modo compartido, que concede acceso de solo lectura compartido a varios subprocesos de lector, lo que les permite leer datos del recurso compartido simultáneamente. Si las operaciones de lectura superan las operaciones de escritura, esta simultaneidad aumenta el rendimiento y el rendimiento en comparación con las secciones críticas.

    Nota

    Los bloqueos srW del modo compartido no se deben adquirir de forma recursiva, ya que esto puede provocar interbloqueos cuando se combina con la adquisición exclusiva.

  • Modo exclusivo, que concede acceso de lectura y escritura a un subproceso de escritor a la vez. Cuando el bloqueo se ha adquirido en modo exclusivo, ningún otro subproceso puede acceder al recurso compartido hasta que el escritor libere el bloqueo.

    Nota

    Los bloqueos SRW de modo exclusivo no se pueden adquirir de forma recursiva. Si un subproceso intenta adquirir un bloqueo que ya contiene, se producirá un error en ese intento (para TryAcquireSRWLockExclusive) o interbloqueo (para AcquireSRWLockExclusive)

Se puede adquirir un único bloqueo SRW en cualquier modo; los subprocesos de lector pueden adquirirlo en modo compartido, mientras que los subprocesos de escritor pueden adquirirlos en modo exclusivo. No hay ninguna garantía sobre el orden en el que se concederá propiedad a los subprocesos que solicitan la propiedad; Los bloqueos SRW no son justos ni FIFO.

Un bloqueo SRW es el tamaño de un puntero. La ventaja es que es rápido actualizar el estado de bloqueo. La desventaja es que se puede almacenar muy poca información de estado, por lo que los bloqueos SRW no detectan un uso recursivo incorrecto en modo compartido. Además, un subproceso que posee un bloqueo SRW en modo compartido no puede actualizar su propiedad del bloqueo al modo exclusivo.

El autor de la llamada debe asignar una estructura SRWLOCK e inicializarla llamando a InitializeSRWLock (para inicializar la estructura dinámicamente) o asignar la constante SRWLOCK_INIT a la variable de estructura (para inicializar la estructura estáticamente).

Puede usar Application Verifier para buscar el uso recursivo (reentrant) de bloqueos SRW.

A continuación se muestran las funciones de bloqueo SRW.

Función de bloqueo SRW Descripción
AcquireSRWLockExclusive Adquiere un bloqueo SRW en modo exclusivo.
AcquireSRWLockShared Adquiere un bloqueo SRW en modo compartido.
InitializeSRWLock Inicialice un bloqueo SRW.
ReleaseSRWLockExclusive Libera un bloqueo SRW que se abrió en modo exclusivo.
ReleaseSRWLockShared Libera un bloqueo SRW que se abrió en modo compartido.
SleepConditionVariableSRW Se suspende en la variable de condición especificada y libera el bloqueo especificado como una operación atómica.
TryAcquireSRWLockExclusive Intenta adquirir un bloqueo delgado de lector/escritor (SRW) en modo exclusivo. Si la llamada se realiza correctamente, el subproceso que realiza la llamada toma propiedad del bloqueo.
TryAcquireSRWLockShared Intenta adquirir un bloqueo delgado de lector/escritor (SRW) en modo compartido. Si la llamada se realiza correctamente, el subproceso que realiza la llamada toma propiedad del bloqueo.