次の方法で共有


C26100

C26100 警告: 競合状態。変数 <var> <lock> のロックで保護する必要があります。

_Guarded_by_コード内のコメントには、共有変数を保護するために使用するロックを指定します。ガードの契約に違反した場合、C26100 の警告が生成されます。

使用例

違反のため次の使用例に警告 C26100 が生成されます、 _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); 
}

契約の違反が発生するは、関数に、不適切なロックを使用しているためUnsafe。この例では、 gCSを使用するのには、適切なロックです。

ときどき共有変数のみ書き込みアクセス権が読み取りアクセスではなく、厳重に保護する必要があります。その場合を使用して、 _Write_guarded_by_アノテーションを次の例に示すように。

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

関数に、不適切なロックを使用しているため次の使用例も C26100 の警告が生成されますUnsafe2。