如果我们使用GCD,是否需要声明属性原子?

时间:2015-06-12 17:46:06

标签: ios objective-c thread-safety grand-central-dispatch atomic

Grand Central Dispatch是否关心原子和非原子关键字,或者我们必须指定原子?

我知道属性声明中的原子和非原子关键字将生成不同的setter和getter,atomic将是线程安全的。

1 个答案:

答案 0 :(得分:3)

使用atomic是从多个线程同步正在使用的属性的一种方法。但是有许多机制可以同步来自多个线程的访问,atomic是一个实用性相当有限的机制。我建议您参考线程编程指南Synchronization章节,以便更全面地讨论替代方案(甚至无法讨论其他当代模式,例如GCD串行队列和具有自定义并发队列的读写器模式。

底线,atomic本身既不必要也不足以确保线程安全。一般来说,它在处理一些简单的基本数据类型(Booleans,NSInteger)时有一些有限的实用性,但在处理更复杂的逻辑或处理可变对象时是不够的。

简而言之,不要假设每次使用GCD时都应使用atomic。事实上,如果你使用GCD,那通常就不需要atomic,事实上,这对GCD的性能不会产生不必要的影响。因此,如果您从多个线程访问某些属性,则应该同步它,但是选择使用哪种同步技术是特定情况的具体细节的函数,并且GCD通常更高效,更完整解。