Pan*_*waj 1 atomic objective-c ios
我读过很多 stackoverflow 的答案,比如原子属性线程安全吗?,什么时候使用@atomic?或者Objective-C 中的原子属性与线程安全,但我对此有疑问:
如果我错了,请纠正我,这就像我正在使用一个用 Atomic 属性声明的计数变量,当前它的值为 5,由两个线程访问,第一个线程将计数值增加 2,第二个线程将计数值减少 1 ,根据我的理解,这会按顺序进行,就像第一个线程增加其值一样,现在是 5 + 2 = 7;之后只有第二个线程可以访问 count 变量,并且只将其值减 1,即 7 - 1 = 6?
第一个线程将计数值增加 2
这不是原子操作,对atomic您没有任何帮助。这是(至少)三个独立的原子操作:
这是经典的多写入器竞争条件。另一个线程可能在“读取值”和“写入值”之间读取。在您的示例中,最终结果可能是 4,因此增加操作完全丢失(A 读取 5,B 读取 5,A +2,A 写入 7,B -1,B 写入 4)。
要解决的问题atomic是,在许多特定于平台的情况下,“读取值”和“写入值”甚至不是原子操作。上面实际上可能是5个操作比如:
如果没有atomic,另一个线程可能会在“写入低位字”和“写入高位字”之间进行读取,并获得从未写入的垃圾值(一个值的一半和另一个值的一半)。通过使用atomic,您可以确保读者始终收到一个“合法”值(在某个时刻写入的值)。但这并不是一个很大的承诺。
但正如您提供的问题中所指出的,如果您需要使读取和写入原子化,那么您几乎肯定需要更多,因为您还希望使“增加值”原子化。所以在实际中atomic很少有用。如果不需要的话,速度会很慢。如果您确实需要它,它可能还不够。
| 归档时间: |
|
| 查看次数: |
212 次 |
| 最近记录: |