Do we need to declare a property atomic if we use GCD?
GrandCentralDispatch关心原子和非原子关键字,还是我们必须指定原子关键字?
我知道属性声明中的原子和非原子关键字将生成不同的setter和getter,原子将是线程安全的。
- 什么是中央调度系统?您应该添加标签,这样您就可以更清楚地了解这一点。
- @Whitecat我认为iOS和Objective-C标签就足够了,但感谢您的评论,我将进行编辑。
- 你应该把你的问题作为文章的第一句话发表。然后张贴你所知道的。使用"this"和"it"这样的词会让人困惑。
使用atomic是同步从多个线程使用的属性的一种方法。但是有许多机制可以同步来自多个线程的访问,而atomic的实用性相当有限。我建议您参考线程编程指南的同步章节来更全面地讨论替代方案(甚至没有讨论其他当代模式,如GCD串行队列和读写器模式与自定义并发队列)。
底线,atomic本身既不必要也不足以确保螺纹安全。一般来说,在处理一些简单的基本数据类型(booleans,NSInteger)时,它的实用性有限,但在处理更复杂的逻辑或处理可变对象时,它是不够的。
简而言之,在使用GCD时,不要假设应该使用atomic。事实上,如果您使用GCD,这通常会消除对atomic的需求,事实上,这将不必要,并对GCD的性能产生不利影响。所以,若您有一些属性是从多个线程访问的,您应该对其进行同步,但选择使用哪种同步技术是特定情况的特定细节的函数,而gcd通常是一个性能更高、更完整的解决方案。
- 在这个问题上,答案是原子能比GCD强,有统计数据支持吗?
- 这将GCD与@synchronized进行比较,两者不同。但它很容易作为基准,例如stackoverflow.com/a/20939025/1271826。但是,原子和GCD之间的速度差一般不是物质的,也不是可观测的。因此,Atomic可以优于GCD(这还不足以在真实的应用程序中看到),但更重要的是,在obj-c中,使用起来更简单。不过,GCD与原子的关系通常不是速度问题。事实上,在我们开发人员处理的99.9%的情况下,atomic在结构上不足以提供必要的同步。它一般不能完成这项工作。
- 总之,我尽可能地使用Objective-C atomic,这实际上是永远不会的。
- 我把nsstring属性从'atomic'改成了'nonatomic',崩溃率提高了,最后一个回溯是-[NSString doubleValue],_NSScanDoubleFromString, _objc_msgSend,在获取这个属性的值的同时,其他线程也在设置它,我不喜欢使用atomic,只是使用方便,不过队友喜欢使用它。
- 如果在另一个线程上更改此线程时对此进行了任何操作,则必须对其进行同步。唯一的问题是原子是否足够。它在"从一个线程读取并在另一个线程中设置"场景中保护您,但是如果您(或将来的某个程序员)曾经使用过可变字符串,那么原子字符串就不够了。顺便说一下,如果你遇到这样的问题,一定要用线程消毒剂调试你的应用。请参见developer.apple.com/videos/play/wwdc2016/412。