Partilhar via


C26100

Aviso C26100: condição de corrida.Variável de <var> deve ser protegido por bloqueio <lock>.

O _Guarded_by_ anotação no código especifica o bloqueio para usar para proteger uma variável compartilhada.C26100 de aviso é gerado quando o contrato de guarda é violado.

Exemplo

O exemplo a seguir gera aviso C26100 porque há uma violação de _Guarded_by_ contrato.

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); 
}

A violação do contrato ocorre porque um bloqueio incorreto é usado na função Unsafe.Nesse caso, gCS é o bloqueio correto para usar.

Ocasionalmente uma variável compartilhada somente deve ser protegido para acesso de gravação, mas não para acesso de leitura.Nesse caso, use o _Write_guarded_by_ anotação, como mostrado no exemplo a seguir.

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); 
} 

Este exemplo também gera aviso C26100 porque ele usa um bloqueio incorreto na função Unsafe2.