Compartilhar via


C26100

aviso C26100: Condição de corrida.A variável <var> deve ser protegida pelo bloqueio <lock>.

A anotação de _Guarded_by_ no código especifica o bloqueio a ser usado para proteger uma variável compartilhado.C26100 de aviso é gerada quando o contrato de protetor é violado.

Exemplo

O exemplo a seguir gerenciar C26100 de aviso porque existe uma violação de contrato de _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); 
}

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

Ocasionalmente uma variável compartilhado só precisa ser guardado para acesso de gravação mas não para acesso de leitura.Nesse caso, use a anotação de _Write_guarded_by_ , conforme 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 gerencia C26100 de aviso incorreto porque usa um bloqueio na função Unsafe2.