Condividi tramite


C26116

warning C26116: Fallimento nell'ottenere o nel trattenere il blocco <lock> in <func>.

L'imposizione in ambito sintattico di acquisire e rilasciare il blocco in coppie nei programmi C/C++ non viene eseguita dal linguaggio.Una funzione può introdurre un effetto collaterale di blocco apportando una modifica osservabile allo stato della concorrenza.Ad esempio, una funzione wrapper di blocco incrementa il numero delle acquisizioni del blocco, o il conteggio dei blocchi, per un blocco specificato. È possibile annotare una funzione che ha un effetto collaterale da un blocco acquisito o rilasciato usando rispettivamente _Acquires_lock_ o _Requires_lock_held.Senza queste annotazioni, una funzione si aspetta di non modificare alcun conteggio dei blocchi dopo che ritorna.Se le acquisizioni e i rilasci non sono equilibrati, sono considerate orfane.L'avviso C26116 viene generato quando una funzione è stata annotata con _Acquires_lock_, ma non acquisisce un blocco, o in una funzione viene annotata con _Requires_lock_held e rilascia il blocco.

Esempio

Nell'esempio seguente viene generato l'avviso C26116 in quanto la funzione DoesNotLock è stata annotata con _Acquires_lock_ ma non ha acquisito il blocco.La funzione DoesNotHoldLock genera l'avviso perché viene annotata con _Requires_lock_held e non trattiene il blocco.

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
}

Vedere anche

Riferimenti

C26115