C26117

警告的C26117:释放对函数 <func>的unheld锁 <lock>。

语法上的范围锁的实现 访问,并锁定 版本 在C/C++程序对受该语言不执行任何操作。 功能可以通过对并发状态的可观测对象的修改引入一个锁的副作用。 例如,锁定包装函数添加锁获取数或锁计数,特定的锁定。使用 _Acquires_lock_ 或 _Releases_lock_,可以分别说明以及如何锁定的副作用获取或锁定版本的功能。 没有此类批注,,在返回之后,函数接受不更改任何锁计数。 如果访问,而且版本不平衡,它们视为 隔离。 警告的C26117问题,如果不说明与 _Releases_lock_ 的功能时释放持有锁,,因为该函数必须拥有锁,在释放之前。

示例

下面的示例生成警告C26117,因为该函数 ReleaseUnheldLock 释放锁它不必 flag 保存方法状态不明确和未指定的批注它应该。

typedef struct _DATA 
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
        EnterCriticalSection(&p->cs);
    // code ...
    LeaveCriticalSection(&p->cs);
}

下面的代码通过确保解决问题释放锁后相同条件下来访问。

typedef struct _DATA 
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
    {
        EnterCriticalSection(&p->cs);
        // code ...
        LeaveCriticalSection(&p->cs);
    }
}

请参见

参考

C26115