Compartir a través de


C26100

Advertencia C26100: Condición de carrera.La variable <var> debe estar protegida por bloqueo <bloqueo>.

La anotación _Guarded_by_ en el código especifica el bloqueo para utilizar la protección de una variable compartida.Se genera la advertencia C26100 cuando se infringe el contrato de restricción.

Ejemplo

El siguiente ejemplo genera la advertencia C26100 porque hay una infracción 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); 
}

La infracción de contrato se produce porque un bloqueo incorrecto se utiliza en la función Unsafe.En este caso, gCS es el bloqueo correcto que hay que utilizar.

Ocasionalmente una variable compartida tiene que guardarse sólo para el acceso de escritura, pero no para el acceso de lectura.En ese caso, utilice la anotación _Write_guarded_by_, como se muestra en el ejemplo siguiente.

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 ejemplo también genera la advertencia C26100 porque utiliza un bloqueo incorrecto en la función Unsafe2.