c++ - 如何使用 C++11 <atomic> 实现指向整数的指针的原子增量?

标签 c++ c++11 atomic

在将一些 Windows C++ 代码移植到 iOS 时,我需要提供 Win32 的 long InterlockedIncrement(long *p) 的实现。称呼。使用 <libkern/OSAtomic.h> 中定义的函数,这很容易。 .

但是,我想知道是否可以仅使用 C++11 工具以与操作系统无关的方式编写它,主要是 <atomic> .我想出了这个,我不确定它是否能实现我想要的:

inline long InterlockedIncrement(long* p)
{
    std::atomic<long&> atomicP(*p);
    return ++atomicP;
}

这行得通吗?这够好吗?这两行不是原子的,但是增量应该是原子的,这是这里的关键。

<atomic> 的所有使用示例我发现是不同的,其中 std::atomic<T>被定义并直接使用。在这里,我想使用调用者通过地址传递给我的现有长变量。我找不到这样的例子。

编辑:Clang 3.2(在 Xcode 4.x 中)无法编译 ++atomicP出现错误“无法增加 std::atomic<long&> 类型的值”(也不是 atomicP += 1)。

正确的方法是什么?

再次编辑:指针实现编译...

inline long InterlockedIncrement(long* p)
{
    std::atomic<long*> atomicP(p);
    return ++(*atomicP);
}

但恐怕这行不通,因为我不增加原子类型,而是指针指向的值,它不是原子的。

最佳答案

您的示例实现每次都从指针构造一个新的原子。这不是 std::atomic 的预期用途,我不相信它会按照您的意愿工作。

据我所知,做您想做的事情的唯一方法(以独立于平台的方式消除对 InterlockedIncrement 的依赖)是用 std 替换您当前调用 Win32“互锁”调用的变量的所有声明: :它们的原子版本。然后,您可以删除互锁调用并使用常规值语义以原子方式修改变量。无论如何,这更具可读性(并且将来更易于维护)。

我了解您希望保留现有的(经过良好测试的)代码,但我认为您不能这样做。

关于c++ - 如何使用 C++11 <atomic> 实现指向整数的指针的原子增量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13399329/

相关文章:

java - Android JNI 从 Java 类中获取两个字段

c++ - std::ifstream::open不一致失败

c++ - 如何通过它的第 0 个位置引用解析这个 vector

c++ - 函数模板参数包后跟模板参数和特化

java - 二进制信号量的使用 - 无法正常工作(卖票)

java - AtomicInteger 和 volatile

c++ - Golang :/usr/local/go/src/Make.:没有那个文件或目录

c++ - 在 C++ 中使用 MPI 对数组进行排序

c++ - 什么是 C++11 原子 API 等同于 `` `__asm__ volatile ("":::: "memory")`` `

c++ - 在 C++ 中,表达式 "*pointer++"是如何工作的?