Bloqueios de LEITOR/Gravador Fino (SRW)

Bloqueios srw (leitor/gravador fino) permitem que os threads de um único processo acessem 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.

    Observação

    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 tiver sido adquirido no modo exclusivo, nenhum outro thread poderá acessar o recurso compartilhado até que o gravador libere o bloqueio.

    Observação

    Bloqueios SRW de modo exclusivo não podem ser adquiridos recursivamente. Se um thread tentar adquirir um bloqueio que ele já contém, essa tentativa falhará (para TryAcquireSRWLockExclusive) ou deadlock (para AcquireSRWLockExclusive)

Um único bloqueio SRW pode ser adquirido em qualquer modo; Os threads de leitor podem adquiri-lo no modo compartilhado, enquanto os threads de gravador podem adquiri-lo no modo exclusivo. Não há nenhuma garantia sobre a ordem em que os threads que solicitam propriedade receberão a 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 o 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 que foi aberto no modo exclusivo.
ReleaseSRWLockShared Libera um bloqueio SRW que foi 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.