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