Sdílet prostřednictvím


C26105

Upozornění C26105: Narušení pořadí uzamčení.Získání zámku <lock> s úrovní <level> způsobí přehození pořadí.

Souběžnost SAL podporuje úrovně uzamčení.Chcete-li deklarovat úroveň uzamčení, která je označena řetězcovým literálem bez uvozovek, použijte anotaci _Create_lock_level_.Lze stanovit pořadí získání mezi dvěma úrovněmi uzamčení pomocí anotace _Set_lock_level_order_(A,B), která nařizuje, že zámky mající úroveň A musí být získány před zámky, které mají úroveň B.Chcete-li vytvořit hierarchii pořadí uzamčení (částečné pořadí mezi úrovněmi uzamčení), použijte více anotací _Set_lock_level_order_.Chcete-li zámek přidružit k úrovni uzamčení, použijte anotaci _Set_lock_level_ při deklaraci zámku.Upozornění C26105 je zobrazeno při zjištění narušení pořadí uzamčení.

Příklad

Následující příklad vygeneruje upozornění C26105, protože ve funkci OrderInversion není přehození pořadí uzamčení.

_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);
}