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 :
|
_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
Especificando quando e onde uma anotação se aplica
Práticas recomendadas e exemplos (SAL)
Conceitos
Outros recursos
Usando o SAL anotações para reduzir os defeitos no código C/C++