C26105
警告 C26105: 鎖定命令違規。 取得具有層級 <level> 的鎖定 <lock> 造成順序反向。
並行 SAL 支援 鎖定等級。 若要由字串常值運算式宣告區塊層級,而不用雙引號,請使用 _Create_lock_level_。 您可以使用標記法 _Set_lock_level_order_(A,B),您可以強制擷取順序在兩個區塊層級之間的,指出,具有層級必須在具有層級 B的鎖定之前取得的鎖定 A 。 若要建立鎖定命令階層架構層級 (在區塊中執行的命令),請使用多元 _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);
}