次の方法で共有


C26105

C26105 警告: ロック順序違反。ロック <lock> レベル <level> 順序を反転をさせます。

同時実行の SAL サポートロック レベル。ロック レベルは、二重引用符をリテラル文字列で示されます、宣言を使用して_Create_lock_level_。買収によって、注釈を使用して、2 つのロック レベル間の注文を課すことができます_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);
}