Aracılığıyla paylaş


C26105

uyarı C26105: Kilitleme sipariş ihlali.<level> düzeyi ile <lock> kilidi almak siparişin ters çevrilmesine neden olur.

Eşzamanlılık SAL Kilit düzeyleri'ni destekler.Çift tırnak işaretleri olmadan bir dize olarak bilinen bir kilit düzeyi bildirmek için _Create_lock_level_kullanın.Ek açıklamayı kullanarak iki kilit düzeyi arasında alım siparişini kazandırabilirsiniz _Set_lock_level_order_(A,B), A düzeyindeki durumları kilitleyen duruma sahip, B düzeyi kilitlenmeden edinilmelidir.Kilit sipariş sıradüzeni (kilit düzeyleri arasında bir kısmi sıra) oluşturmak için birden çok kez _Set_lock_level_order_ ek açıklamalarını kullanın.Kilit ile kilit düzeyi ilişkilendirmek için kilidi tanımladığınızda _Set_lock_level_ ek açıklamasını kullanın.Bir kilitleme ihlal siparişi algılandığında, uyarı C26105 verilir.

Örnek

Aşağıdaki örnek, C26105 uyarısını oluşturur, çünkü OrderInversion fonksiyonunda bir kilit evirimi vardır.

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