在将一些 Windows C++ 代码移植到 iOS 时,我需要提供 Win32long InterlockedIncrement(long *p)
调用的实现。这很容易使用定义的函数<libkern/OSAtomic.h>
。
但是,我想知道是否可以仅使用 C++11 工具以与操作系统无关的方式编写它,主要是<atomic>
. 我想出了这个,我不确定它是否能实现我想要的:
inline long InterlockedIncrement(long* p)
{
std::atomic<long&> atomicP(*p);
return ++atomicP;
}
这行得通吗?这够好吗?这两行不是原子的,但增量应该是原子的,这是这里的关键。
<atomic>
我发现的所有使用示例都是不同的,其中 astd::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);
}
但是恐怕这不起作用,因为我不增加原子类型,而是增加指针指向的值,这不是原子的。