Freigeben über


C26105

Warnung C26105: Sperrverletzung Reihenfolge.Sperre <lock> mit <level> bewirkt, dass Bestellung Inversion.

Parallelität SAL unterstützt Lock-Level.Um eine Sperrebene zu deklarieren, das durch eine Zeichenfolge ohne Anführungszeichen gekennzeichnet ist, verwenden Sie _Create_lock_level_.Sie können einen Auftrag vom Erwerb zwischen zwei Ebenen der Sperre mithilfe der Anmerkungs zu verhängen _Set_lock_level_order_(A,B), die Staaten, die die Sperren haben A müssen vor dem Sperren, die Ebene aktiviert werden B.Um eine Bestellung Sperrhierarchie (einer Teilbestellung zu Lock-Ebenen) herstellen, verwenden Sie mehrere _Set_lock_level_order_ Anmerkungen.Um eine Sperre mit einer Sperre zuzuordnen, verwenden Sie die _Set_lock_level_ Anmerkung Wenn Sie die Sperre deklarieren.C26105 Warnung wird ausgegeben, wenn eine Bestellung Verletzung Sperre erkannt wird.

Beispiel

Im folgende Beispiel wird C26105 Warnung generiert, da es eine Sperre Reihenfolge Umkehrung der Funktion gibt 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);
}