C26105

警告 C26105:锁定顺序冲突。获取具有级别 <level> 的锁 <lock> 导致顺序反向。

并发 SAL 支持 lock 级别。若要声明锁定级别,由无双引号的字符串表示,请使用 _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);
}