原子特性和用法

时间:2018-02-13 11:31:55

标签: ios objective-c atomic

我已经阅读过很多stackoverflow答案,例如Is an atomic property thread safe?When to use @atomic?Atomic properties vs thread-safe in Objective-C,但我对此有疑问:

请纠正我如果我错了,这就像我使用的是一个我用Atomic属性声明的count变量,目前它的值是5 这是由两个线程访问的,第一个线程是将计数值增加2,第二个线程将计数值减少1,根据我的理解,这顺序就像第一个线程增加其值,现在是5 + 2 = 7;之后只有第二个线程可以访问计数变量,只能将其值减1,即7 - 1 = 6?

3 个答案:

答案 0 :(得分:3)

  

将计数值增加2的第一个线程

这不是原子操作,atomic绝不会帮助你。这是(至少)三个独立的原子操作:

  • 读取值
  • 增加值
  • 写入值

这是经典的多作家竞赛条件。另一个线程可能读取"读取值"和#34;写入价值。"在您的示例中,最终结果可能是4,因此增加操作完全丢失(A读取5,B读取5,A + 2,A写入7,B -1,B写入4)。

atomic要解决的问题是"读取值"和#34;写入价值"在许多平台特定的情况下,甚至不是原子操作。以上可能实际上是5个操作,例如:

  • 读下面的单词
  • 读上面的单词
  • 增加值
  • 写下字
  • 写上面的单词

如果没有atomic,另一个线程可能会在"写下字"之间读取。和#34;写上面的单词"并获得一个从未写过的垃圾值(一个值的一半和另一个值的一半)。通过使用atomic,您可以确保读者始终能够获得合法的"价值(在某一点上写的)。但这并不是一个承诺。

但正如您提供的问题中所指出的,如果您需要进行原子读写操作,那么您几乎肯定需要更多,因为您还希望提高"增加价值"原子。所以在实践中atomic很少有用。如果你不需要它,它会很慢。如果你确实需要它,那可能就不够了。

答案 1 :(得分:1)

基于原子的属性,其中两个线程正在访问同一个对象以增加或减少一个值,你可以理解这两个都访问了相同/整个值,即5但是第一个线程试图更新这个值然后这个被锁定没有其他线程可以同时更新,但是第二个线程也具有相同的值,只有当第一个线程退出Count对象更新时才能更新。

答案 2 :(得分:0)

好的,线程可能不会按顺序执行,第一个创建的线程可能会在第二个线程之后运行。如果线程按您描述的顺序执行,则提到的行为就可以了。但我认为你对线程安全存在误解。

我们建议您详细了解Concurrency Programming GuideThread safe