Как реализовать атомарное приращение указателя на целое число с помощью 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); } Но я боюсь, что это не сработает, поскольку я увеличиваю не атомарный тип, а значение, указанное указателем, которое не является атомарным.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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