非原子线程和原子线程在目标c中是不安全的



我读到非原子和原子都是线程不安全的。但nonatomic更快,因为它允许更快的异步访问,而atomic更慢,它允许更慢的同步访问。

Objective C中的atomic属性保证您永远不会看到部分写入。

也就是说,如果两个线程同时将值A和B写入同一变量X,那么对同一变量的并发读取将产生X的初始值,或者A或B。对于nonatomic,不再提供这种保证。您可以获得任何值,包括从未显式写入该变量的值。

原因是使用nonatomic,读取线程可能会在另一个线程正在写入变量时读取该变量。因此,您读取的部分内容来自旧值,而另一部分内容来自新值。

关于它们都是线程不安全的评论指的是,除此之外,没有任何额外的保证。苹果的文档给出了以下示例:

考虑一个XYZPerson对象,其中一个人的第一个和最后一个使用一个线程中的原子访问器更改名称。如果另一个线程同时访问两个名称,原子getter方法将返回完整的字符串(不会崩溃),但没有保证这些值将是相对于每个值的正确名称另外如果在更改前访问了第一个名称,但访问了最后一个名称在更改后被访问,您将得到一个不一致的,名称对不匹配。

纯粹主义者可能会认为线程安全的定义过于严格。从技术上讲,atomic已经负责数据竞争和排序,从语言设计者的角度来看,这就是您所需要的。

另一方面,从应用程序逻辑的角度来看,前面提到的名字姓氏示例显然构成了一个bug。需要额外的同步来消除不希望出现的行为。在这个特定于应用程序的视图中,类XYZPerson不是线程安全的。但是这里我们讨论的线程安全级别不同于语言设计者所拥有的级别。

最新更新