Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Блок, относящийся только к системам Майкрософт
Эти функции выполняют атомарное добавление, что гарантирует успешное завершение операции, когда несколько потоков имеют доступ к общей переменной.
Синтаксис
long _InterlockedAdd(
long volatile * Addend,
long Value
);
long _InterlockedAdd_acq(
long volatile * Addend,
long Value
);
long _InterlockedAdd_nf(
long volatile * Addend,
long Value
);
long _InterlockedAdd_rel(
long volatile * Addend,
long Value
);
__int64 _InterlockedAdd64(
__int64 volatile * Addend,
__int64 Value
);
__int64 _InterlockedAdd64_acq(
__int64 volatile * Addend,
__int64 Value
);
__int64 _InterlockedAdd64_nf (
__int64 volatile * Addend,
__int64 Value
);
__int64 _InterlockedAdd64_rel(
__int64 volatile * Addend,
__int64 Value
);
Параметры
Слагаемое
[in, out] Указатель на целое число, в который нужно добавить; заменен результатом добавления.
Value
[in] Добавляемое значение.
Возвращаемое значение
Обе функции возвращают результат сложения.
Требования
Intrinsic | Архитектура |
---|---|
_InterlockedAdd |
ARM, ARM64 |
_InterlockedAdd_acq |
ARM, ARM64 |
_InterlockedAdd_nf |
ARM, ARM64 |
_InterlockedAdd_rel |
ARM, ARM64 |
_InterlockedAdd64 |
ARM, ARM64 |
_InterlockedAdd64_acq |
ARM, ARM64 |
_InterlockedAdd64_nf |
ARM, ARM64 |
_InterlockedAdd64_rel |
ARM, ARM64 |
Файл<заголовка intrin.h>
Замечания
Версии этих функций с суффиксами _acq
или _rel
выполняют блокируемое сложение с последующим получением или освобождением семантики. Получение семантики означает, что результат операции становится видимым для всех потоков и процессоров, прежде чем все последующие операции чтения и записи памяти. Получение полезно при входе в критический раздел. Семантика выпуска означает, что все операции чтения и записи памяти вынуждены быть видимыми для всех потоков и процессоров до того, как результат операции станет видимым. Освобождение полезно при выходе из критического раздела. Встроенные компоненты с суффиксом _nf
("без забора") не действуют в качестве барьера памяти.
Эти процедуры доступны только как встроенные объекты.
Пример: _InterlockedAdd
// interlockedadd.cpp
// Compile with: /Oi /EHsc
// processor: ARM
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(_InterlockedAdd)
int main()
{
long data1 = 0xFF00FF00;
long data2 = 0x00FF0000;
long retval;
retval = _InterlockedAdd(&data1, data2);
printf("0x%x 0x%x 0x%x", data1, data2, retval);
}
Выходные данные: _InterlockedAdd
0xffffff00 0xff0000 0xffffff00
Пример: _InterlockedAdd64
// interlockedadd64.cpp
// compile with: /Oi /EHsc
// processor: ARM
#include <iostream>
#include <intrin.h>
using namespace std;
#pragma intrinsic(_InterlockedAdd64)
int main()
{
__int64 data1 = 0x0000FF0000000000;
__int64 data2 = 0x00FF0000FFFFFFFF;
__int64 retval;
cout << hex << data1 << " + " << data2 << " = " ;
retval = _InterlockedAdd64(&data1, data2);
cout << data1 << endl;
cout << "Return value: " << retval << endl;
}
Выходные данные: _InterlockedAdd64
ff0000000000 + ff0000ffffffff = ffff00ffffffff
Return value: ffff00ffffffff
Завершение блока, относящегося только к системам Майкрософт
См. также
Встроенные компоненты компилятора
Конфликты с 32-разрядным (x86) компилятором