Freigeben über


C26100

Warnung C26100: Race-Bedingung.Variable <var> sollte durch <lock>-Sperre geschützt werden.

Die _Guarded_by_ Anmerkung im Code gibt die Sperre zu verwenden, um eine gemeinsam genutzte Variable zu schützen.C26100 Warnung wird generiert, wenn der Guard-Vertrag verletzt wird.

Beispiel

Im folgende Beispiel wird C26100 Warnung generiert, da gibt es ein Verstoß gegen die _Guarded_by_ Vertrag.

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

Die Vertragsverletzung auftritt, da eine falsche Sperre, in der Funktion verwendet wird Unsafe.In diesem Fall gCS ist die richtige Sperre verwenden.

Gelegentlich muss eine gemeinsam genutzte Variable nur für den Schreibzugriff, aber nicht für den Lesezugriff geschützt sein.In diesem Fall verwenden Sie die _Write_guarded_by_ Annotation, wie im folgenden Beispiel gezeigt.

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

In diesem Beispiel generiert auch die Warnung C26100 da eine falsche Sperre in der Funktion verwendet Unsafe2.