替换已弃用的API OSAtomicIncrement32Barrier以用于原子递增/递减变量

时间:2018-04-16 06:00:07

标签: multithreading c++11 atomic macos-high-sierra xcode9.2

我最近升级到XCode 9.2(macos 10.13),我注意到苹果已弃用某些来自OSAtomic的API,如OSAtomicIncrement32BarrierOSAtomicDecrement32Barrier。我们正在使用这些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>,正如我已经提到的那样

0 个答案:

没有答案