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