Как реализовать атомарное приращение указателя на целое число с помощью std::atomic? ⇐ 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); } Но я боюсь, что это не сработает, поскольку я увеличиваю не атомарный тип, а значение, указанное указателем, которое не является атомарным.
При переносе некоторого кода 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); } Но я боюсь, что это не сработает, поскольку я увеличиваю не атомарный тип, а значение, указанное указателем, которое не является атомарным.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка API критериев: оператор не существует: целое число = целое число []
Anonymous » » в форуме JAVA - 0 Ответы
- 62 Просмотры
-
Последнее сообщение Anonymous
-