Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Освобождение неопубликованной блокировки "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);
}
}