C26105C26105

Advertencia C26105: orden infracción de bloqueo.warning C26105: Lock order violation. Adquirir el bloqueo <bloqueo > con un nivel <nivel > causas orden inversión.Acquiring lock <lock> with level <level> causes order inversion.

SAL de simultaneidad es compatible con bloquear niveles.Concurrency SAL supports lock levels. Para declarar un nivel de bloqueo que se indica mediante una cadena literal sin comillas dobles, use _Create_lock_level_.To declare a lock level, which is denoted by a string literal without double quotes, use _Create_lock_level_. Puede imponer un orden de adquisición entre los dos niveles de bloqueo mediante la anotación _Set_lock_level_order_(A,B), que establece que los bloqueos que tiene el nivel de A deben adquirirse antes de bloqueos que tienen el nivel de B.You can impose an order of acquisition between two lock levels by using the annotation _Set_lock_level_order_(A,B), which states that locks that have level A must be acquired before locks that have level B. Para establecer una jerarquía de orden de bloqueo (un orden parcial entre niveles de bloqueo), utilice varias _Set_lock_level_order_ anotaciones.To establish a lock order hierarchy (a partial order among lock levels), use multiple _Set_lock_level_order_ annotations. Para asociar un bloqueo con un nivel de bloqueo, use la _Set_lock_level_ anotación cuando se declara el bloqueo.To associate a lock with a lock level, use the _Set_lock_level_ annotation when you declare the lock. C26105 de advertencia se emite cuando se detecta un bloqueo de infracción de ordenación.Warning C26105 is issued when a lock ordering violation is detected.

EjemploExample

El ejemplo siguiente genera la advertencia C26105 porque no hay una inversión del orden de bloqueo en la función OrderInversion.The following example generates warning C26105 because there is a lock order inversion in the function 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);  
}