Lire en anglais

Partager via


Avertissement C26105

Violation de l’ordre de verrouillage. L’acquisition du verrou « lock » avec le niveau « level » entraîne l’inversion de l’ordre.

Concurrency SAL prend en charge les niveaux de verrouillage. Pour déclarer un niveau de verrou, qui est indiqué par un littéral de chaîne sans guillemets doubles, utilisez _Create_lock_level_. Vous pouvez imposer un ordre d’acquisition entre deux niveaux de verrou à l’aide de l’annotation _Set_lock_level_order_(A,B), qui indique que les verrous qui ont un niveau A doivent être acquis avant les verrous qui ont le niveau B. Pour établir une hiérarchie d’ordre de verrouillage (ordre partiel entre les niveaux de verrou), utilisez plusieurs _Set_lock_level_order_ annotations. Pour associer un verrou à un niveau de verrou, utilisez l’annotation _Set_lock_level_ lorsque vous déclarez le verrou. Avertissement C26105 est émis lorsqu’une violation d’ordre de verrouillage est détectée.

Exemple

L’exemple suivant génère l’avertissement C26105, car il existe une inversion d’ordre 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);
}