Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
Condición de carrera. La variable 'var' debe protegerse mediante el bloqueo 'lock'.
Comentarios
La anotación _Guarded_by_ del código especifica el bloqueo que se va a usar para proteger una variable compartida. La advertencia C26100 se genera cuando se infringe el contrato de protección.
Nombre de análisis de código: RACE_CONDITION
Ejemplos
En el ejemplo siguiente se genera la advertencia C26100 porque hay una infracción del _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);
}
La infracción del contrato se produce porque se usa un bloqueo incorrecto en la función Unsafe. En este caso, gCS es el bloqueo correcto que se va a usar.
En ocasiones, una variable compartida solo tiene que protegerse para el acceso de escritura, pero no para el acceso de lectura. En ese caso, use la anotación _Write_guarded_by_, tal 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);
}
En este ejemplo también se genera la advertencia C26100 porque usa un bloqueo incorrecto en la función Unsafe2.