共用方式為


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