Как реализовать атомарное приращение указателя на целое число с помощью std::atomic?C++

Программы на C++. Форум разработчиков
Гость
Как реализовать атомарное приращение указателя на целое число с помощью std::atomic?

Сообщение Гость »


При переносе некоторого кода Windows C++ на iOS мне нужно предоставить реализацию вызова Win32 long InterlockedIncrement(long *p). Это достаточно просто, используя функции, определенные в .

Однако мне интересно, можно ли написать его независимо от операционной системы, используя только возможности C++11, в основном . Я придумал это, которое, я не уверен, достигает того, чего я хочу:

inline long InterlockedIncrement(long* p) { std::atomicatomicP(*p); вернуть ++атомныйP; } Это работает? Это достаточно хорошо? Эти две строки не являются атомарными, но приращение должно быть атомарным, что здесь является ключевым моментом.

Все примеры использования , которые я нашел, различны, где std::atomic определяется и используется напрямую. Здесь я хочу использовать существующую длинную переменную, которую вызывающая сторона передает мне по адресу. Я не смог найти такого примера.

Изменить: Clang 3.2 (в Xcode 4.x) не может скомпилировать ++atomicP с ошибкой «невозможно увеличить значение типа std::atomic» " (и atomicP += 1).

Какой путь будет правильным?

Измените еще раз: реализация указателя компилируется...

inline long InterlockedIncrement(long* p) { std::atomicatomicP(p); возврат ++(*atomicP); } Но я боюсь, что это не сработает, поскольку я увеличиваю не атомарный тип, а значение, указанное указателем, которое не является атомарным.

Вернуться в «C++»