我最近升级到XCode 9.2(macos 10.13)
,我注意到苹果已弃用某些来自OSAtomic的API,如OSAtomicIncrement32Barrier
或OSAtomicDecrement32Barrier
。我们正在使用这些API以原子方式递增或递减变量。
根据apple的说法,对于原子增量,必须使用atomic_fetch_add
代替OSAtomicIncrement32Barrier
。但是OSAtomicIncrement32Barrier
的参数类型及其替换atomic_fetch_add
是非常不同的。前API需要volatile int32_t *
作为输入参数,但后者需要volatile atomic<_Tp>*
。我们有一个int32_t
变量,其值必须以原子方式递增或递减。
由于遗留代码,我无法将变量类型从int32_t
更改为std::atomic<int32_t>
,这是调用atomic_fetch_add
所必需的。
我找到了一些解决方案,但我不确定它是否会在多线程环境中以原子方式正确递增或递减变量。
使用int32_t
当前定义的宏
OSAtomicIncrement32Barrier
变量
#define AtomicIncrement(x) OSAtomicIncrement32Barrier ( &(x) )
建议使用新API(atomic_fetch_add
)
#define AtomicIncrement(x) std::atomic<int32_t> var(x); \
std::atomic_fetch_add(&var, 1); \
x = std::atomic_load(&var);
这可以作为上述宏的替代吗?如果没有,我如何用新API替换现有的弃用API行为?
此外,我无法将变量类型从int32_t
更改为std::atomic<int32_t>
,正如我已经提到的那样