The new home for Visual Studio documentation is Visual Studio 2017 Documentation on docs.microsoft.com.

The latest version of this topic can be found at C26116.

warning C26116: Failing to acquire or to hold lock <lock> in <func>.

Enforcement of syntactically scoped lock acquire and lock release pairs in C/C++ programs is not performed by the language. A function may introduce a locking side effect by making an observable modification to the concurrency state. For example, a lock wrapper function increments the number of lock acquisitions, or lock count, for a given lock.You can annotate a function that has a side effect from a lock acquire or lock release by using _Acquires_lock_ or _Requires_lock_held, respectively. Without such annotations, a function is expected not to change any lock count after it returns. If acquires and releases are not balanced, they are considered to be orphaned. Warning C26116 is issued when a function has been annotated with _Acquires_lock_, but it does not acquire a lock, or when a function is annotated with _Requires_lock_held and releases the lock.

The following example generates warning C26116 because the function DoesNotLock was annotated with _Acquires_lock_ but does not acquire it. The function DoesNotHoldLock generates the warning because it is annotated with _Requires_lock_held and does not hold it.

typedef struct _DATA   
} 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