C26105

警告 C26105: ロック順序の違反です。ロック <ロック> をレベル <レベル> で取得すると、順序の逆転が発生します

同時実行の SAL で ロックのレベルがサポートされます。二重引用符なしでリテラル文字列によって表示されるロックのレベルを宣言するには _Create_lock_level_を使用します。水平方向のあるロックはレベルの Bがあるロックの前に A 取得する必要があることを示すコメント _Set_lock_level_order_(A,B)を使用して 2 個のロックのレベル間の順序を指定できます。ロック順序階層 (ロックのレベル間の部分的な順序) を設定するには、_Set_lock_level_order_ の複数の注釈を使用します。ロックを宣言すると、ロックのレベルでロックを関連付けるには、_Set_lock_level_ の注釈を使用します。警告 C26105 はロック命令違反が検出された場合に発生します。

使用例

次の例では、関数 OrderInversionにロック順序を逆になるため、警告 C26105 を生成します。

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