Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Гонки. Переменная var должна быть защищена блокировкой "lock".
Замечания
Заметка _Guarded_by_ в коде указывает блокировку, используемую для защиты общей переменной. Предупреждение C26100 создается при нарушении контракта охранника.
Имя анализа кода: RACE_CONDITION
Примеры
В следующем примере создается предупреждение C26100 из-за нарушения _Guarded_by_ контракта.
CRITICAL_SECTION gCS;
_Guarded_by_(gCS) int gData;
typedef struct _DATA {
_Guarded_by_(cs) int data;
CRITICAL_SECTION cs;
} DATA;
void Safe(DATA* p) {
EnterCriticalSection(&p->cs);
p->data = 1; // OK
LeaveCriticalSection(&p->cs);
EnterCriticalSection(&gCS);
gData = 1; // OK
LeaveCriticalSection(&gCS);
}
void Unsafe(DATA* p) {
EnterCriticalSection(&p->cs);
gData = 1; // Warning C26100 (wrong lock)
LeaveCriticalSection(&p->cs);
}
Нарушение контракта возникает из-за неправильной блокировки, используемой в функции Unsafe. В этом случае gCS используется правильная блокировка.
Иногда общая переменная должна быть защищена только для доступа на запись, но не для доступа на чтение. В этом случае используйте заметку _Write_guarded_by_ , как показано в следующем примере.
CRITICAL_SECTION gCS;
_Guarded_by_(gCS) int gData;
typedef struct _DATA2 {
_Write_guarded_by_(cs) int data;
CRITICAL_SECTION cs;
} DATA2;
int Safe2(DATA2* p) {
// OK: read does not have to be guarded
int result = p->data;
return result;
}
void Unsafe2(DATA2* p) {
EnterCriticalSection(&gCS);
// Warning C26100 (write has to be guarded by p->cs)
p->data = 1;
LeaveCriticalSection(&gCS);
}
В этом примере также создается предупреждение C26100, так как он использует неправильную блокировку функции Unsafe2.