Freigeben über


C26105

Warnung C26105: Sperrenreihenfolgenverletzung.Beim Abrufen der Sperre <Sperre> mit der Ebene <Ebene> tritt eine Reihenfolgenumstellung auf.

Parallelität SALZ-Stützsperrenebenen.Um eine Sperrenebene zu deklarieren, die von ein Zeichenfolgenliteral ohne doppelte Anführungszeichen angibt, verwenden Sie _Create_lock_level_.Sie können eine Reihenfolge der Auflistung zwischen zwei Sperrenebenen festlegen, indem Sie die Anmerkung _Set_lock_level_order_(A,B) verwenden, die angibt, dass Sperren, die Unterscheidung ausgerichtetes haben A, abgerufen werden müssen, bevor Sperren die Unterscheidung ausgerichtetes B haben.Um eine Sperrenreihenfolgenhierarchie (eine partielle Reihenfolge mit Sperrenebenen) festzulegen, verwenden Sie mehrere _Set_lock_level_order_ Anmerkungen.Um eine Sperre mit einer Sperrenebene zuzuordnen, verwenden Sie die _Set_lock_level_ - Anmerkung wenn Sie die Einchecksperre deklarieren.Warnung C26105 wird ausgegeben, wenn eine Sperrenreihenfolgenverletzung erkannt wird.

Beispiel

Im folgenden Beispiel wird die Warnung C26105, da es eine Sperrenreihenfolgenumstellung in der Funktion OrderInversion ergibt.

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