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


Функция ExInterlockedAddUlong (wdm.h)

Подпрограмма ExInterlockedAddUlong добавляет длинное значение без знака в заданное целое число без знака в виде атомарной операции.

Синтаксис

ULONG ExInterlockedAddUlong(
  [in, out] PULONG      Addend,
  [in]      ULONG       Increment,
  [in, out] PKSPIN_LOCK Lock
);

Параметры

[in, out] Addend

Указатель на длинное целое число без знака, значение которого должно быть изменено значением приращения .

[in] Increment

Указывает длинное целое число без знака, которое необходимо добавить.

[in, out] Lock

Указатель на блокировку спина, которая будет использоваться для синхронизации доступа к надстройке.

Возвращаемое значение

ExInterlockedAddUlong возвращает исходное (неуправляемое) значение надстройки.

Комментарии

Вместо этой процедуры рекомендуется использовать InterlockedExchangeAdd . InterlockedExchangeAdd может быть более эффективным, так как он не использует спиновую блокировку и встраиваются компилятором.

Предполагается, что процедуры поддержки, которые выполняют операции с блокировкой, не могут вызвать ошибку страницы. То есть ни их код, ни какие-либо данные, к которым они касаются, не могут вызвать ошибку страницы без сбоя системы. Они используют спиновые блокировки для достижения атомарности на симметричном многопроцессорном компьютере. Вызывающий объект должен предоставить резидентное хранилище для блокировки, которая должна быть инициализирована с помощью KeInitializeSpinLock перед первоначальным вызовом ExInterlockedXxx.

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

ExInterlockedAddUlong маскирует прерывания. Следовательно, его можно использовать для синхронизации между ISR и другим кодом драйвера при условии, что та же блокировка никогда не используется повторно в вызове подпрограммы, которая выполняется в IRQL = DISPATCH_LEVEL.

Обратите внимание, что вызовы InterlockedXxx гарантированно будут атомарными по отношению к другим вызовам InterlockedXxx без блокировок спина, предоставляемых вызывающим.

Вызывающие функции ExInterlockedAddUlong выполняются в любом IRQL. Хранилище для параметра Addend должно быть резидентным во всех списках IRQL.

Требования

Требование Значение
Минимальная версия клиента Доступно начиная с Windows 2000.
Целевая платформа Универсальное
Верхняя часть wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Любой уровень (см. раздел "Примечания")

См. также раздел

ExInterlockedAddLargeInteger

InterlockedDecrement

InterlockedIncrement

KeInitializeSpinLock