Partilhar via


Fechaduras finas de leitor/gravador (SRW)

Os bloqueios finos de leitor/gravador (SRW) permitem que os threads de um único processo acessem recursos compartilhados; Eles são otimizados para velocidade e ocupam muito pouca memória. Bloqueios finos de leitor-gravador não podem ser compartilhados entre processos.

Os threads do leitor leem dados de um recurso compartilhado, enquanto os threads do 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 de leitura 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 leitores, 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 impasses quando combinados com a aquisição exclusiva.

  • Modo exclusivo, que concede acesso de leitura/gravação a um thread de gravador de cada 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

    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 modo; Os threads do leitor podem adquiri-lo no modo compartilhado, enquanto os threads do escritor podem adquiri-lo no modo exclusivo. Não há garantia sobre a ordem em que os threads que solicitam a propriedade receberão a propriedade; As fechaduras SRW não são justas nem FIFO.

Um bloqueio SRW é do tamanho de um ponteiro. A vantagem é que é rápido atualizar o estado de bloqueio. A desvantagem é que muito pouca informação de estado pode ser armazenada, de modo que os bloqueios SRW não detetam 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 o SRWLOCK_INIT constante à variável de estrutura (para inicializar a estrutura estaticamente).

Você pode usar Application Verifier para encontrar o uso recursivo (reentrante) de bloqueios SRW.

A seguir estão as funções de bloqueio SRW.

Função de bloqueio SRW Descrição
AcquireSRWLockExclusive Adquire um bloqueio SRW em modo exclusivo.
AcquireSRWLockShared Adquire um bloqueio SRW no modo compartilhado.
InitializeSRWLock Inicialize 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 Suspende na variável de condição especificada e libera o bloqueio especificado como uma operação atômica.
TryAcquireSRWLockExclusive Tenta adquirir um bloqueio fino de leitor/gravador (SRW) no modo exclusivo. Se a chamada for bem-sucedida, o thread de chamada assume a propriedade do bloqueio.
TryAcquireSRWLockShared Tenta adquirir um bloqueio fino de leitor/gravador (SRW) no modo compartilhado. Se a chamada for bem-sucedida, o thread de chamada assume a propriedade do bloqueio.