Partager via


C26100

avertissement C26100 : Condition de concurrence critique.La variable <var> doit être protégée par le verrou <lock>.

L'annotation _Guarded_by_ dans le code spécifie le verrou à utiliser pour protéger une variable partagée.L'avertissement C26100 est généré lorsque le contrat de protection est violé.

Exemple

L'exemple suivant génère l'avertissement C26100 car il existe une violation du contrat _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 violation de contrat se produit parce qu'un verrou incorrect est utilisé dans la fonction Unsafe.Dans ce cas, gCS est le verrou correct à utiliser.

Parfois une variable partagée doit être gardée uniquement pour l'accès en écriture mais pas pour l'accès en lecture.Dans ce cas, utilisez l'annotation _Write_guarded_by_ , comme indiqué dans l'exemple suivant.

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

Cet exemple génère également l'avertissement C26100 car il utilise un verrou incorrect dans la fonction Unsafe2.