Compartir a través de


C26105

advertencia C26105: Infracción de orden de bloqueo.Adquirir el cerrojo <lock> con nivel <level> produce la inversión de orden.

La simultaneidad SAL admite niveles de bloqueo.Para declarar un nivel de bloqueo, que se indica mediante un literal de cadena sin comillas dobles, utilice _Create_lock_level_.Se puede imponer un orden de adquisición entre dos niveles de bloqueo mediante la anotación _Set_lock_level_order_(A,B), que indica que los bloqueos que tienen nivel A deben adquirirse antes que los bloqueos que tienen nivel B.Para establecer una jerarquía de orden de bloqueo (un orden parcial entre niveles de bloqueo), utilice varias anotaciones _Set_lock_level_order_.Para asociar un bloqueo con un nivel de bloqueo, utilice la anotación _Set_lock_level_ cuando se declare el bloqueo.La advertencia C26105 se emite cuando se detecta una infracción de bloqueo de pedido.

Ejemplo

El ejemplo siguiente genera la advertencia C26105 porque hay una inversión del orden de bloqueo en la función 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);
}