Предупреждение C26117
Освобождение неопубликованной блокировки "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);
}
}
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по