C26100
警告 C26100: 競合状態です。変数 <var> をロック <ロック> で保護する必要があります
コードの _Guarded_by_ の注釈を指定するようにロックを共有変数を保護するために指定します。警告 C26100 をガードのコントラクトに違反した場合に発生します。
使用例
次の例では _Guarded_by_ のコントラクト違反があるため C26100 警告を生成します。
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);
}
この例では、関数 Unsafe2で不適切なロックを使用するため C26100 警告を生成します。