““原子”属性与线程安全性

问题描述 投票:0回答:2

我相信我了解原子属性(和非原子属性)的行为,但是由于经常提及原子性“不保证线程安全”的概念,我有些困惑。在解释原子属性的上下文中,该语句made often使我有些困惑,因为从显而易见的意义上来说,我所读到的,该属性的线程安全性正是您所要获得的(尽管不再)。 >

我的理解是:

  • atomic属性(为the default,而显式为nonatomic)保证永远不会回读由于多个写入线程导致的垃圾值。换句话说,如果值本身的写入需要多个步骤(例如在内存中进行多个字写入),则该写入将是原子的。因此,从给定线程中读取属性将始终反映过去在some point

    处完整写入的值,尽管当然,随后的读取可能会显示一些不同的值。
  • 如果读取(或确实写入)属性是需要任何进一步保证的操作的一部分,例如,更新两个在语义上链接的属性,或者需要对必须为假定在执行该操作之前将其保持不变-则需要程序员进一步锁定或同步,以使总体语义保持线程安全。

  • 换句话说,原子属性本身的写入和读取实际上是“线程安全的”(受多个编写者的保护,不受损坏),但是当然,保护并没有扩展到任何更广泛的逻辑。

  1. 这是准确的理解吗?
  2. atomic属性在什么广泛情况下实际上有用?我可以构想一些简单的示例,其中属性是某种计数器或不断变化的对象,不需要反映当前状态,等等,但是与多线程方案相比,这似乎并不常见,在这种情况下,您确实确实需要对访问进行显式锁定-在这种情况下如果您可能一直在实际属性上使用nonatomic
  3. 人们为什么总是一致地说原子性不是“保证线程安全性?”似乎只有NSLock不能保证线程安全或synchronized不能保证线程安全的方式才是正确的-对于未启动的警告?否则,这似乎是一个令人困惑的名称,因为这些同步机制的真正意义在于它们用于线程安全设计,并且众所周知,它们在其设计操作中是可靠的。
  4. Rob Napier's answer here表示同意以上#2。非常感谢熟悉atomic实际用法的人,如果我在这里有正确的想法,请告诉我。

我相信我了解原子属性(和非原子属性)的行为,但是由于经常提到原子性“不能保证线程安全”这一概念,我感到有些困惑。这个...

objective-c multithreading
2个回答
0
投票

这不是线程安全的,这意味着如果线程A正在访问您的变量,那么线程B,C,D也可以访问并对其进行更改。因此,在线程A的末尾,不知道变量包含什么。


0
投票

换句话说,原子属性本身的写入和读取实际上是“线程安全的”(受多个编写者的保护,不受破坏,但当然,保护范围不涉及任何更广泛的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.