Bloqueios de LEITOR/Gravador Fino (SRW)
Bloqueios srw (leitor/gravador fino) habilitam os threads de um único processo para acessar recursos compartilhados; eles são otimizados para velocidade e ocupam muito pouca memória. Bloqueios de leitor e gravador finos não podem ser compartilhados entre processos.
Os threads de leitor leem dados de um recurso compartilhado, enquanto os threads de gravador gravam dados em um recurso compartilhado. Quando vários threads estão lendo e gravando usando um recurso compartilhado, bloqueios exclusivos como uma seção crítica ou mutex podem se tornar um gargalo se os threads do leitor forem executados continuamente, mas as operações de gravação forem raras.
Os bloqueios SRW fornecem dois modos nos quais os threads podem acessar um recurso compartilhado:
modo compartilhado, que concede acesso somente leitura compartilhado a vários threads de leitor, o que permite que eles leiam dados do recurso compartilhado simultaneamente. Se as operações de leitura excederem as operações de gravação, essa simultaneidade aumentará o desempenho e a taxa de transferência em comparação com as seções críticas.
Nota
Os bloqueios SRW de modo compartilhado não devem ser adquiridos recursivamente, pois isso pode levar a deadlocks quando combinados com aquisição exclusiva.
modo exclusivo, que concede acesso de leitura/gravação a um thread de gravador por vez. Quando o bloqueio foi adquirido no modo exclusivo, nenhum outro thread pode acessar o recurso compartilhado até que o gravador libere o bloqueio.
Nota
Os bloqueios SRW de modo exclusivo não podem ser adquiridos recursivamente. Se um thread tentar adquirir um bloqueio que ele já mantém, essa tentativa falhará (para TryAcquireSRWLockExclusive) ou deadlock (para AcquireSRWLockExclusive)
Um único bloqueio SRW pode ser adquirido em qualquer um dos modos; os threads de leitor podem adquiri-lo no modo compartilhado, enquanto os threads de gravador podem adquiri-lo no modo exclusivo. Não há garantia sobre a ordem na qual os threads que solicitam propriedade receberão propriedade; Os bloqueios SRW não são justos nem FIFO.
Um bloqueio SRW é do tamanho de um ponteiro. A vantagem é que é rápido atualizar o estado de bloqueio. A desvantagem é que poucas informações de estado podem ser armazenadas, portanto, os bloqueios SRW não detectam o uso recursivo incorreto no modo compartilhado. Além disso, um thread que possui um bloqueio SRW no modo compartilhado não pode atualizar sua propriedade do bloqueio para o modo exclusivo.
O chamador deve alocar uma estrutura SRWLOCK e inicializá-la chamando InitializeSRWLock (para inicializar a estrutura dinamicamente) ou atribuir a constante SRWLOCK_INIT à variável de estrutura (para inicializar a estrutura estaticamente).
Você pode usar do Verificador de Aplicativos para localizar o uso recursivo (reentrante) de bloqueios SRW.
Veja a seguir as funções de bloqueio SRW.
Função de bloqueio SRW | Descrição |
---|---|
acquireSRWLockExclusive | Adquire um bloqueio SRW no modo exclusivo. |
AcquireSRWLockShared | Adquire um bloqueio SRW no modo compartilhado. |
InitializeSRWLock | Inicializar um bloqueio SRW. |
ReleaseSRWLockExclusive | Libera um bloqueio SRW aberto no modo exclusivo. |
releaseSRWLockShared | Libera um bloqueio SRW aberto no modo compartilhado. |
SleepConditionVariableSRW | Dorme na variável de condição especificada e libera o bloqueio especificado como uma operação atômica. |
TryAcquireSRWLockExclusive | Tenta adquirir um bloqueio srw (leitor/gravador) fino no modo exclusivo. Se a chamada for bem-sucedida, o thread de chamada assumirá a propriedade do bloqueio. |
TryAcquireSRWLockShared | Tenta adquirir um bloqueio srw (leitor/gravador) fino no modo compartilhado. Se a chamada for bem-sucedida, o thread de chamada assumirá a propriedade do bloqueio. |