Поделиться через


C26105

Предупреждение C26105: Нарушение порядка блокировки.Получение блокировки <блокировка> с уровнем <уровень> вызывает обращение порядка.

Параллелизм SAL поддерживает Уровни блокировки.Чтобы объявить уровень блокировки, помеченный строковым литералом без двойных кавычек, используйте _Create_lock_level_.Можно установить порядок приема между уровнями двух блокировок с помощью аннотации _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);
}