Partilhar via


C26105

aviso C26105: Violação do pedido de bloqueio.A aquisição do bloqueio <lock> com o nível <level> causa a inversão da ordem.

O oferece suporte de SAL de simultaneidade bloqueiam níveis.Para declarar um nível de bloqueio, que é denotado por um literal de cadeia de caracteres sem aspas duplas, use _Create_lock_level_.Você pode impor uma ordem de aquisição entre dois níveis de bloqueio usando a anotação _Set_lock_level_order_(A,B), que indica que os bloqueios que têm em nível A devem ser adquiridos antes que os bloqueios que têm Bde nível.Para estabelecer uma hierarquia de pedido de bloqueio (uma ordem parcial entre níveis de bloqueio), use vários anotações de _Set_lock_level_order_ .Para associar um bloqueio com um nível de bloqueio, use a anotação de _Set_lock_level_ quando declara o bloqueio.C26105 de aviso é emitido quando um bloqueio que classifica a violação é detectado.

Exemplo

O exemplo a seguir gerenciar C26105 de aviso porque existe uma inversão de pedido de bloqueio na função OrderInversion.

_Create_lock_level_(MutexLockLevel);
_Create_lock_level_(TunnelLockLevel);
_Create_lock_level_(ChannelLockLevel);
_Lock_level_order_(MutexLockLevel, TunnelLockLevel);
_Lock_level_order_(TunnelLockLevel, ChannelLockLevel);
_Has_lock_level_(MutexLockLevel) HANDLE gMutex;

struct Tunnel 
{
    _Has_lock_level_(TunnelLockLevel) CRITICAL_SECTION cs;
};

struct Channel 
{
    _Has_lock_level_(ChannelLockLevel) CRITICAL_SECTION cs;
};

void OrderInversion(Channel* pChannel, Tunnel* pTunnel) 
{
    EnterCriticalSection(&pChannel->cs); 
    // Warning C26105
    WaitForSingleObject(gMutex, INFINITE); 
    EnterCriticalSection(&pTunnel->cs);
    LeaveCriticalSection(&pTunnel->cs);
    LeaveCriticalSection(&pChannel->cs);
}