Condividi tramite


Avviso C26116

Impossibile acquisire o bloccare il blocco 'lock' in 'func'.

L'applicazione di coppie di blocco con ambito sintattico acquisisci e blocca le coppie di rilascio nei programmi C/C++ non viene eseguita dal linguaggio. Una funzione può introdurre un effetto collaterale di blocco apportando una modifica osservabile allo stato di concorrenza. Ad esempio, una funzione wrapper di blocco incrementa il numero di acquisizioni di blocchi o il conteggio dei blocchi per un determinato blocco. È possibile annotare una funzione che ha un effetto collaterale da un blocco acquisire o bloccare il rilascio usando _Acquires_lock_ rispettivamente o _Requires_lock_held. Senza tali annotazioni, è previsto che una funzione non modifichi alcun conteggio di blocchi dopo la restituzione. Se le acquisizioni e le versioni non sono bilanciate, vengono considerate orfane. L'avviso C26116 viene generato quando una funzione è stata annotata con _Acquires_lock_, ma non acquisisce un blocco o quando una funzione viene annotata con _Requires_lock_held e rilascia il blocco.

Esempio

L'esempio seguente genera l'avviso C26116 perché la funzione DoesNotLock è stata annotata con _Acquires_lock_ ma non la acquisisce. La funzione DoesNotHoldLock genera l'avviso perché viene annotata con _Requires_lock_held e non lo contiene.

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
}

Vedi anche