Condividi tramite


C26105

avviso C26105: Violazione di ordinamento del blocco.Acquisire il blocco <lock> con il livello <level> causa l'inversione dell'ordinamento.

Concurrency SAL supporta i livelli dei blocchi.Per dichiarare un livello di blocco, che è denotato da un valore letterale di tipo stringa senza virgolette, utilizzare _Create_lock_level_.È possibile imporre un ordine di acquisizione tra due livelli di blocco utilizzando l'annotazione _Set_lock_level_order_(A,B), che indica che i blocchi con livello A devono essere acquisiti prima dei blocchi con livello B.Per stabilire una gerarchia di ordine dei blocchi (un ordine parziale tra i livelli di blocco), utilizzare le annotazioni multiple _Set_lock_level_order_.Per associare un blocco a un livello di blocco, utilizzare l'annotazione _Set_lock_level_ quando si dichiara il blocco.L'avviso C26105 viene generato quando una violazione di ordinamento del blocco viene rilevata.

Esempio

Nell'esempio seguente viene generato l'avviso C26105 perché c'è un inversione di ordinamento del blocco nella funzione 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);
}