Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se describe la estructura ERESOURCE y las rutinas proporcionadas por el sistema que funcionan en él. Puede usar estructuras ERESOURCE para implementar el bloqueo de lectura y escritura en el controlador.
Estructura ERESOURCE
La estructura ERESOURCE se usa para administrar el acceso a los recursos compartidos. Proporciona un mecanismo para sincronizar el acceso a los recursos que se pueden compartir entre varios subprocesos.
La estructura ERESOURCE es opaca; es decir, sus miembros están reservados para uso del sistema.
El almacenamiento para ERESOURCE debe asignarse desde un grupo no paginado.
Rutinas de ERESOURCE
El sistema proporciona rutinas para adquirir y liberar estructuras ERESOURCE y para examinar su estado actual.
Adquisición y liberación de una estructura ERESOURCE
Los controladores pueden usar las estructuras ERESOURCE para implementar la sincronización exclusiva o compartida. La sincronización exclusiva o compartida funciona de la siguiente manera:
Cualquier número de subprocesos puede adquirir un ERESOURCE como compartido.
Solo un subproceso puede adquirir un ERESOURCE exclusivamente. El ERESOURCE solo se puede adquirir exclusivamente si no hay subprocesos ya adquiridos como compartidos.
Un subproceso que no puede adquirir actualmente un ERESOURCE puede colocarse opcionalmente en un estado de espera hasta que se pueda adquirir el ERESOURCE. El sistema mantiene dos listas de subprocesos que están esperando un ERESOURCE: una lista de waiters exclusivos y una lista de esperas compartidas.
Un uso típico para la sincronización exclusiva o compartida es implementar un bloqueo de lectura y escritura. Un bloqueo de lectura y escritura permite que varios subprocesos realicen una operación de lectura, pero solo un subproceso puede escribir a la vez. Este escenario se puede implementar directamente en términos de adquirir un ERESOURCE.
Un controlador asigna el almacenamiento para un ERESOURCE e lo inicializa con ExInitializeResourceLite. El sistema mantiene una lista de todas las estructuras ERESOURCE en uso. Cuando el controlador ya no requiere un ERESOURCE determinado, debe llamar a ExDeleteResourceLite para eliminarlo de la lista del sistema. El controlador también puede reutilizar un ERESOURCE llamando a ExReinitializeResourceLite.
Los controladores pueden realizar las siguientes operaciones básicas en un ERESOURCE:
Adquiera un ERESOURCE como compartido con ExAcquireResourceSharedLite. Esta rutina adquiere el recurso solo si el recurso no se adquirió exclusivamente y no hay ningún waiter exclusivo.
Adquiera un ERESOURCE exclusivamente con ExAcquireResourceExclusiveLite. Esta rutina adquiere el recurso siempre y cuando no se haya adquirido exclusivamente o como compartido.
Convierta una adquisición exclusiva en una adquisición compartida con ExConvertExclusiveToSharedLite.
Libere un recurso adquirido con ExReleaseResourceLite.
El parámetro Wait de ExAcquireResourceSharedLite y ExAcquireResourceExclusiveLite determina si el subproceso actual espera a que se adquiera el ERESOURCE. Si especifica un valor false y el ERESOURCE no se puede adquirir, la rutina devuelve FALSE. Si especifica un valor de TRUE, el subproceso actual se coloca en la lista de espera adecuada para ERESOURCE.
Examen del estado de una estructura ERESOURCE
Un controlador también puede determinar el estado actual de un ERESOURCE, como se indica a continuación:
Use ExIsResourceAcquiredLite o ExIsResourceAcquiredSharedLite para determinar si el ERESOURCE ya se adquirió como compartido o exclusivo. Use ExIsResourceAcquiredExclusiveLite para comprobar si el ERESOURCE se adquirió exclusivamente.
Use ExGetSharedWaiterCount para determinar el número de esperas compartidos para ERESOURCE y use ExGetExclusiveWaiterCount para determinar el número de esperas exclusivos para el ERESOURCE.