C26105
Aviso C26105: violação de ordem de bloqueio.Aquisição de bloqueio <lock> com o nível de <level> faz a inversão de ordem.
Simultaneidade SAL suporta níveis de bloqueio.Para declarar um nível de bloqueio, que é indicado por uma seqüência de caracteres literal 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 estados bloqueios que têm nível A devem ser adquiridos antes de bloqueios que tenham nível B.Para estabelecer uma hierarquia de ordem de bloqueio (uma ordem parcial entre níveis de bloqueio), use vários _Set_lock_level_order_ anotações.Para associar um bloqueio de um nível de bloqueio, use o _Set_lock_level_ anotação ao declarar o bloqueio.C26105 de aviso é emitido quando um pedido violação de bloqueio é detectado.
Exemplo
O exemplo a seguir gera aviso C26105 porque há uma inversão de ordem 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);
}