C26105

警告 C26105: 锁定顺序冲突。获取锁 <lock> 与 <level> 级别 导致顺序反转。

并发 SAL 支持锁定级别。若要声明的锁定级别,而无需双引号引起来的字符串表示,使用_Create_lock_level_。您可以使用批注的两个锁定级别之间的收购的订单来实施_Set_lock_level_order_(A,B),锁定,其中规定了级别A必须具有级别的锁之前获取B。要建立锁顺序层次结构 (在锁定级别之间的部分顺序),请使用多个_Set_lock_level_order_批注。若要锁定级别相关联的锁定,请使用_Set_lock_level_声明锁定时的注释。检测到订购冲突的锁时,会发出警告 C26105。

示例

因为没有锁定顺序反转的函数中,下面的示例生成警告 C26105 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);
}