インタロックされたオペランドのドライバー注釈
ある大きな関数ファミリは、パラメーターの 1 つとして、インターロックされたプロセッサ命令を使用してアクセスする必要がある変数のアドレスを受け取ります。 これらはキャッシュ リードスルー アトミック命令であり、オペランドが正しく使用されていないと非常に微妙なバグが発生します。
関数パラメーターに対して次の注釈を使用して、これをインターロックされたオペランドとして識別します。
インターロックされたオペランド注釈 | 説明 |
---|---|
_Interlocked_operand_ | 注釈付きの関数パラメーターは、インターロックされた関数の 1 つのターゲット オペランドです。 これらのオペランドには、特定の追加プロパティが必要です。 |
_Interlocked_operand_ で注釈が付けられた関数パラメーターは、プロセス間で共有されることが想定されています。 この注釈で使用される変数は、次の条件を満たす必要があります。
volatile として宣言される。
ローカル変数ではない。 ローカル変数を使用した場合、通常、関数の意図を誤解していることを示します。 ローカル変数がなんらかの形で共有されている場合でも、システム ページングの要件によって、別のプロセスでの変数のアドレス指定で問題が発生します。
インターロックされた関数を除き、アクセスされない。 インターロックされた関数を明示的に使用しないと、古いデータへのアクセスが発生したり、単一のプロセッサのキャッシュ内でのみ操作が発生したり、システムの残りの部分に到達するのが遅れたりする可能性があります。
システム提供の関数では、インターロックされたオペランドの注釈が既に付けられています。
InterlockedExchange 関数の注釈の例を次に示します。 この注釈は、Target パラメーターにアクセスする際にインターロックされた操作を常に使用する必要があることを指定します。
LONG
InterlockedExchange (
_Inout_ _Interlocked_operand_ LONG volatile *Target,
_In_ LONG Value
);