Partilhar via


Anotando o comportamento de bloqueio

Para evitar erros concorrentes em seu programa de vários segmentos, sempre execute uma disciplina apropriado de bloqueio e use um de SAL.

Erros concorrentes notòria são difíceis de reproduzir, diagnosticar, e depuração porque elas. não determinísticasRaciocinar sobre a interpolação de segmentos é difícil melhor possível, e se torna prático quando você estiver criando um corpo de código que tem mais do que alguns segmentos.Como consequência, é boa prática seguir uma disciplina de bloqueio em seus programas multi-thread.Por exemplo, obedecendo um bloqueio de classificação para obter mais bloqueios que ajuda a evitar que deadlocks, e aquisição o bloqueio de segurança adequado antes de acessar um recurso compartilhadas de ajuda a evitar as condições de corrida.

Infelizmente, as regras convenientemente simples de bloqueio podem ser difíceis de surpreendentemente seguir na prática.Uma limitação fundamental nas linguagens de programação de hoje e em compiladores é que eles não suportam diretamente a especificação e análise de requisitos de simultaneidade.Os desenvolvedores precisam confiar em informais comentários de código para expressar suas intenções sobre como usam bloqueios.

As anotações de SAL de simultaneidade são criadas para ajudá-lo a especificar efeitos colaterais de bloqueio, responsabilidade de bloqueio, tutela de dados, hierarquia de ordem de bloqueio, e outros comportamentos bloqueando esperado.Fazendo regras implícitas explícitas, as anotações de simultaneidade de SAL fornecem uma maneira consistente para que você documente como seu código usa regras de bloqueio.As anotações de simultaneidade também aprimoram a capacidade de ferramentas de análise de código para localizar as condições de corrida, deadlocks, combinadas errado operações de sincronização, e outros erros sutis de simultaneidade.

Diretrizes gerais

Usando as anotações, você pode indicar que são contratos implicados por definições de função entre implementações callees () e clientes (chamar), e express invariants e outras propriedades de programa que ainda pode melhorar a análise.

O SAL suporte muitos tipos diferentes de bloqueio primitivo- por exemplo, seções críticos, mutexes, bloqueios de rotação, e outros objetos de recursos.Muitas anotações de simultaneidade têm uma expressão de bloqueio como um parâmetro.Por convenção, um bloqueio é denotado pela expressão de caminho do objeto de bloqueio subjacente.

Qualquer segmento seguro regras de propriedade para ter em mente:

  • Os bloqueios de rotação são os bloqueios uncounted que têm a propriedade clara do segmento.

  • Mutexes e as seções são críticos os bloqueios contados que têm a propriedade clara do segmento.

  • Os semáforos e eventos são os bloqueios contados que não tenham a propriedade clara do segmento.

Anotações de Bloqueio

A tabela a seguir lista as anotações de bloqueio.

Anotação

Descrição

_Acquires_exclusive_lock_(expr)

Annotates uma função e indica que no estado de postagem os incrementos de função por um a contagem de bloqueio exclusivo do objeto de bloqueio que é chamado por expr.

_Acquires_lock_(expr)

Annotates uma função e indica que no estado de postagem os incrementos de função por um a contagem de bloqueio de objeto de bloqueio que é chamado por expr.

_Acquires_nonreentrant_lock_(expr)

O bloqueio que é chamado por expr é adquirido.Um erro é relatado se o bloqueio é mantido já.

_Acquires_shared_lock_(expr)

Annotates uma função e indica que no estado de postagem os incrementos de função por um a contagem compartilhado de bloqueio de objeto de bloqueio que é chamado por expr.

_Create_lock_level_(name)

Uma instrução que declara o símbolo name para ser um nível de bloqueio para que ele possa ser usado em um _Has_Lock_level_ e _Lock_level_order_.

_Has_lock_kind_(kind)

Anota qualquer objeto para refinar a informação de tipo de um objeto de recurso.Às vezes, um tipo comum é usado para tipos diferentes de recursos e o tipo sobrecarregado não é suficiente para distinguir os requisitos de semântica entre vários recursos.Aqui está uma lista de parâmetros predefinidos de kind :

_Lock_kind_mutex_

Identificação do tipo de bloqueio para mutexes.

_Lock_kind_event_

Identificação do tipo de bloqueio para eventos.

_Lock_kind_semaphore_

Identificação do tipo de bloqueio para semáforos.

_Lock_kind_spin_lock_

Identificação do tipo de bloqueio para bloqueios de rotação.

_Lock_kind_critical_section_

Identificação do tipo de bloqueio para seções críticas.

_Has_lock_level_(name)

Annotates um objeto de bloqueio e oferece o bloqueio em nível de name.

_Lock_level_order_(name1, name2)

Uma declaração que dá a ordenação de bloqueio entre name1 e name2.

_Post_same_lock_(expr1, expr2)

Annotates uma função e indica que no estado de postagem os dois bloqueios, expr1 e expr2, é tratado como se eles o mesmo objeto de bloqueio.

_Releases_exclusive_lock_(expr)

Annotates uma função e indica que no estado de postagem as diminuições de função por uma contagem de bloqueio exclusivo do objeto de bloqueio que é chamado por expr.

_Releases_lock_(expr)

Annotates uma função e indica que no estado de postagem as diminuições de função por uma contagem de bloqueio de objeto de bloqueio que é chamado por expr.

_Releases_nonreentrant_lock_(expr)

O bloqueio que é chamado por expr é liberado.Um erro é relatado se o bloqueio não é mantido no momento.

_Releases_shared_lock_(expr)

Annotates uma função e indica que no estado de postagem as diminuições de função por uma contagem compartilhado de bloqueio de objeto de bloqueio que é chamado por expr.

_Requires_lock_held_(expr)

Annotates uma função e indica-a em pre que indica que a contagem de bloqueio do objeto que é chamado por expr é pelo menos um.

_Requires_lock_not_held_(expr)

Annotates uma função e indica-a em pre que indica que a contagem de bloqueio do objeto que é chamado por expr são zero.

_Requires_no_locks_held_

Annotates uma função e indica que as contagens de bloqueio de todos os bloqueios que são conhecidas quando ele for zero.

_Requires_shared_lock_held_(expr)

Annotates uma função e indica-a em pre que indica que a contagem compartilhado de bloqueio do objeto que é chamado por expr é pelo menos um.

_Requires_exclusive_lock_held_(expr)

Annotates uma função e indica-a em pre que indica que a contagem de bloqueio exclusivo do objeto que é chamado por expr é pelo menos um.

Intrinsics de SAL para objetos não expostos de bloqueio

Certos objetos de bloqueio não são expostos pela implementação das funções de bloqueio associadas.A tabela a seguir lista as variáveis intrínsecos de SAL que permitem anotações nas funções que operam nesses objetos não expostos de bloqueio.

Anotação

Descrição

_Global_cancel_spin_lock_

Descreve o bloqueio de rotação cancelar.

_Global_critical_region_

Descreve a região crítica.

_Global_interlock_

Descreve operações protegido.

_Global_priority_region_

Descreve a região de prioridade.

Anotações de Acesso a Dados Compartilhados

A tabela a seguir lista as anotações para acesso a dados compartilhado.

Anotação

Descrição

_Guarded_by_(expr)

Annotates uma variável e indica que sempre que a variável é acessado, a contagem de bloqueio de objeto de bloqueio que é chamado por expr é pelo menos um.

_Interlocked_

Anota uma variável e é equivalente a _Guarded_by_(_Global_interlock_).

_Interlocked_operand_

O parâmetro de função anotado é o operando de destino de uma das várias funções interconectadas.Esses operandos devem ter propriedades adicionais específicas.

_Write_guarded_by_(expr)

Annotates uma variável e indica que a variável sempre que for alterado, a contagem de bloqueio de objeto de bloqueio que é chamado por expr é pelo menos um.

Consulte também

Referência

Anotando parâmetros de função e valores de retorno

Anotando o comportamento da função

Anotando estruturas e classes

Especificando quando e onde uma anotação se aplica

Funções intrínsecas

Práticas recomendadas e exemplos (SAL)

Conceitos

Noções básicas sobre SAL

Outros recursos

Usando o SAL anotações para reduzir os defeitos no código C/C++

Blog da equipe de análise de código