C26116
предупреждение C26116: Не удается захватить или удержать блокировку <lock> в <func>.
Синтаксическое выделение области блокировки между парными acquire и release в программах C/C++ не требуется.Функция может добиться побочного эффекта блокировки внесением наблюдаемых изменений в состояние параллелизма.Например, функция-оболочка блокировки увеличивает число методов блокировки или количество блокировок для данной блокировки. Можно аннотировать функцию, которая использует захват блокировки или освобождение с помощью _Acquires_lock_ или _Requires_lock_held соответственно.При отсутствии этих аннотаций предполагается, что функция не изменяет количество блокировок после своего завершения.Если захваты и освобождения не сбалансированы, то они считаются осиротевшими.Предупреждение C26116 выдается, если функция была аннотирована как _Acquires_lock_, но не захватывает блокировку, или когда функция аннотирована как _Requires_lock_held и освобождает блокировку.
Пример
Следующий пример вызывает предупреждение C26116, поскольку функция DoesNotLock была аннотирована как _Acquires_lock_, но не захватывает блокировку.Функция DoesNotHoldLock вызывает предупреждение, поскольку она аннотирована как _Requires_lock_held и не удерживает блокировку.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
_Acquires_lock_(p->cs) void DoesLock(DATA* p)
{
EnterCriticalSection(&p->cs); // OK
}
_Acquires_lock_(p->cs) void DoesNotLock(DATA* p)
{
// Warning C26116
}
_Requires_lock_held_(p->cs) void DoesNotHoldLock(DATA* p)
{
LeaveCriticalSection(&p->cs); // Warning C26116
}