共用方式為


C26117

警告 C26117: 釋放在函式 <func>的未保留的鎖定 <lock> 。

在語法上是範圍鎖定的執行緒 取得 和鎖定 C/C++ 程式的發行沒有由語言執行。 函式可以藉由對並行狀態的可預見值的變更產生新的鎖定副作用。 例如,鎖定包裝函式將鎖定獲取數目或鎖定計數遞增,並使用指定的鎖定。您可以使用 _Acquires_lock_ 或 _Releases_lock_,您也可以分別註記從鎖定的副作用 (Side Effect) 取得或鎖定版本的函式。 如果沒有這種附註,在這種情況下,在它傳回之後,函式預期不會變更任何鎖定計數。 如果取得與釋放不平痕,它們會變為孤立。 警告 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