Заметки драйвера для межблоковых операндов

Большое семейство функций принимает в качестве одного из своих параметров адрес переменной, к которой следует получить доступ с помощью инструкции процессора с блокировкой. Это атомарные инструкции с прямым чтением из кэша, и если операнды используются неправильно, возникают очень тонкие ошибки.

Используйте следующую аннотацию для параметров функции, чтобы определить его как взаимоблокируемый операнд.

Аннотация о синхронизированном операнде Описание
_Interlocked_operand_ Параметр аннотированной функции является целевым операндом одной из заблокированных функций. Эти операнды должны иметь определенные дополнительные свойства.

Ожидается, что параметры функции, аннотированные с _Interlocked_operand_, будут совместно использоваться между процессами. Переменные, используемые с этой заметкой, должны:

  • Объявите volatile.

  • Не быть локальной переменной. Использование локальной переменной обычно указывает на недоразумение намерения функции. Даже если локальная переменная каким-то образом является общим, системные требования к разбиению по страницам делают адресацию переменных в другом процессе проблематичным.

  • К ней можно получить доступ только через взаимосвязанную функцию. Без явного использования взаимоблокирующей функции операция может получить доступ к устаревшим данным, может обращаться только к кэшу одного процессора или может быть задержана при распространении в остальной части системы.

Системные функции уже аннотированы для межблокированных операндов.

В следующем примере показана заметка для функции InterlockedExchange . Эта заметка указывает, что к параметру Target всегда требуется доступ с помощью операции с блокировкой.

LONG  
InterlockedExchange (  
    _Inout_ _Interlocked_operand_ LONG volatile *Target,  
    _In_ LONG Value  
    );  

Заметки SAL 2.0 для драйверов