Condividi tramite


C26100

warning C26100: Race condition.La variabile <var> deve essere protetta dal blocco <lock>.

L'annotazione _Guarded_by_ nel codice specifica il blocco da utilizzare per proteggere una variabile condivisa.L'avviso C26100 viene generato quando viene violato il contratto di protezione.

Esempio

Nell'esempio seguente viene generato un'avviso C26100, perché c'è una violazione del contratto _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); 
}

La violazione del contratto si verifica perché viene utilizzato un blocco non corretto nella funzione Unsafe.In questo caso, gCS è il blocco corretto da utilizzare.

Occasionalmente una variabile condivisa deve essere protetta solo per l'accesso in scrittura ma non per l'accesso in lettura.In tal caso, utilizzare l'annotazione _Write_guarded_by_, come illustrato nell'esempio seguente.

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

Questo esempio genera inoltre l'avviso C26100 perché utilizza un blocco non corretto nella funzione Unsafe2.