@synchronized块内的OSMemoryBarrier,替换为atomic_thread_fence

时间:2019-01-10 20:00:14

标签: objective-c concurrency thread-safety

我正在升级项目,并从Xcode收到以下警告

  

'OSMemoryBarrier'已被弃用:首先在iOS 10.0中弃用-改为使用atomic_thread_fence()

通过这种方法

- (nonnull id)objectForKey:(nonnull id)source {
id key = self.keyGenerator ? self.keyGenerator(source) : source;
id value = self.values[key];
if (!value) {
    @synchronized(self) {
        value = self.values[key];
        if (!value) {
            value = self.valueGenerator(source);
            OSMemoryBarrier();
            self.values[key] = value;
        }
    }
}
OSMemoryBarrier();
return value;
}

我仍在尝试了解内存屏障和栅栏是如何工作的,上面的代码使我感到困惑的部分是OSMemoryBarrier()调用的位置,以及为什么需要在{{ 1}}块。

我也不确定替换它的最佳方法,看起来@synchronized带有参数,而且不确定在任何地方都应该使用哪个参数。

0 个答案:

没有答案