Поделиться через


C26100

Предупреждение C26100: Состояние гонки.Переменная <var> должна быть защищена блокировкой <lock>.

Аннотация _Guarded_by_ в коде указывает на блокировку, использующуюся для защиты общих переменных.Предупреждение C26100 появляется, когда контракт защиты нарушен.

Пример

Следующий пример приводит к появлению предупреждения 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.