Partager via


C26105

avertissement C26105 : Ordre de violation de verrou.En faisant glisser le verrou <lock> avec un niveau <level> cause une inversion d'ordre.

Le SAL d'accès concurrentiel prend en charge le verrouillage des niveaux.Pour déclarer un niveau de verrou, qui est illustré par la chaîne de caractères sans guillemets, utilisez _Create_lock_level_.Vous pouvez imposer une ordre d'acquisition entre deux niveaux de verrou à l'aide de l'annotation _Set_lock_level_order_(A,B), qui déclare que les verrouillages dotés de niveau A doivent être obtenus avant les verrous de niveau B.Pour établir une hiérarchie de commande de verrouillage (une commande partielle entre les niveaux de verrou), utilisez plusieurs annotations _Set_lock_level_order_.Pour associer un verrou avec un niveau de verrou, utilisez l'annotation _Set_lock_level_ lorsque vous déclarez le verrou.L'avertissement C26105 est émis lorsque un verrou qui ordonne une violation est détecté.

Exemple

L'exemple suivant génère l'avertissement C26105 car il existe une inversion de commande de verrouillage dans la fonction 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);
}