Поделиться через


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

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

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

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

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

  • Быть объявлен переменным.

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

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

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

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

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

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