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


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
}

См. также

Ссылки

C26115