Udostępnij za pośrednictwem


C26105

Ostrzeżenie C26105: naruszenie kolejności blokady.Pobieranie blokady <lock> z poziomu <level> powoduje odwrócenie kolejności.

Współbieżny SAL obsługuje poziomy blokad.Aby zadeklarować poziom blokady, który jest oznaczany przez literał ciągu znaków bez cudzysłowów, użyj _Create_lock_level_.Możesz narzucić kolejność nabycia między dwoma poziomami blokady za pomocą adnotacji _Set_lock_level_order_(A,B), która oznacza, że blokady o poziomie A muszą zostać uzyskane przed blokadami o poziomie B.Aby ustanowić hierarchię kolejności blokad (porządek częściowy między poziomami blokad), użyj wielu adnotacji _Set_lock_level_order_.Aby skojarzyć blokadę z poziomem blokady, użyj adnotacji _Set_lock_level_, gdy deklarujesz blokadę.Ostrzeżenie C26105 jest wydawane, gdy zostanie wykryte naruszenie kolejności blokad.

Przykład

Poniższy przykład generuje ostrzeżenie C26105, ponieważ kolejność blokad została odwrócona w funkcji 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);
}