在将一些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>
我找到的是不同的,其中a 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);
}
但是我担心这不起作用,因为我不增加原子类型,而是指针指向的值,这不是原子的。