Предупреждение C26116

Не удалось приобрести или сохранить блокировку в "func".

Принудительное применение синтаксически область заблокированных пар получения и блокировки в программах 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
}

См. также