Заметки драйвера для взаимосвязанных операндов
Большое семейство функций принимает в качестве одного из своих параметров адрес переменной, к которому следует обращаться с помощью инструкции процессора с блокировкой. Это атомарные инструкции для чтения в кэше, и если операнды используются неправильно, возникают очень тонкие ошибки.
Используйте следующую заметку для параметров функции, чтобы определить ее как взаимосвязанный операнд.
Заметка к интерблокируемым операндам | Описание |
---|---|
_Interlocked_operand_ | Параметр функции с заметками является целевым операндом одной из взаимосвязанных функций. Эти операнды должны иметь определенные дополнительные свойства. |
Ожидается, что параметры функции, помеченные _Interlocked_operand_, будут совместно использоваться между процессами. Переменные, используемые с этой заметкой, должны:
Быть объявлен переменным.
Не быть локальной переменной. Использование локальной переменной обычно указывает на неправильное понимание намерения функции. Даже если локальная переменная каким-то образом является общей, требования к разбиению по страницам системы делают адресацию переменных в другом процессе проблематичной.
Доступ к ней выполняется только с помощью функции interlocked. Без явного использования заблокированной функции операция может получить доступ к устаревшим данным, может происходить только в кэше одного процессора или может быть отложена при достижении остальной части системы.
Системные функции уже помечены для взаимосвязанных операндов.
В следующем примере показана заметка для функции InterlockedExchange . Эта заметка указывает, что доступ к параметру Target всегда должен осуществляться с помощью операции блокировки.
LONG
InterlockedExchange (
_Inout_ _Interlocked_operand_ LONG volatile *Target,
_In_ LONG Value
);