Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Освобождение неопубликованной блокировки "lock" в функции "func".
Замечания
Принудительное применение синтаксически ограниченных пар блокировки при получении и блокировке в программах 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);
}
}