Compartir a través de


Advertencia C26116

No se puede adquirir o mantener el bloqueo "lock" en "func".

El lenguaje no realiza el cumplimiento de pares de adquisición y liberación de bloqueos de bloqueo sintáctica en programas de C/C++. Una función puede introducir un efecto secundario de bloqueo realizando una modificación observable en el estado de simultaneidad. Por ejemplo, una función contenedora de bloqueo incrementa el número de adquisiciones de bloqueos o recuento de bloqueos para un bloqueo determinado. Puede anotar una función que tenga un efecto secundario de una adquisición de bloqueo o de una liberación de bloqueo mediante _Acquires_lock_ o _Requires_lock_held, respectivamente. Sin estas anotaciones, se espera que una función no cambie ningún recuento de bloqueos después de que devuelva resultados. Si las adquisicións y las versiones no están equilibradas, se consideran huérfanas. Advertencia C26116 se emite cuando una función se ha anotado con _Acquires_lock_, pero no adquiere un bloqueo o cuando una función se anota con _Requires_lock_held y libera el bloqueo.

Ejemplo

En el ejemplo siguiente se genera la advertencia C26116 porque la función DoesNotLock se ha anotado con _Acquires_lock_ pero no la adquiere. La función DoesNotHoldLock genera la advertencia porque está anotada con _Requires_lock_held y no la mantiene.

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
}

Consulte también