线程安全和读写安全有什么区别?

20 浏览
0 Comments

线程安全和读写安全有什么区别?

这个问题已经在这里有答案了

原子属性和非原子属性有什么区别?

iOS中,原子属性只是保证了读写的安全性,而不是线程的安全性。有人说线程安全是更高级的概念,我对它们的区别感到困惑。有时候,读写安全是否可以用来实现线程安全?当原子属性无法保证线程安全时,为什么我们还要在多线程中使用它?

admin 更改状态以发布 2023年5月20日
0
0 Comments

原子性保证只有一个属性可以独占执行,也就是说,不能同时读取/写入对象的单个属性。

然而,原子性并不保证同一对象的两个不同属性在同时访问/写入时是互斥的。

最常用的例子是一个包含 firstNamelastName 属性的Person 类。

let person = Person()
// Thread 1
person.firstName = "Name1"
person.lastName = "LastName1"
// Thread 2
person.firstName = "Name2"
person.lastName = "LastName2"

最坏情况下,person 的值可能会是Name1 LastName 2Name2 LastName1

这就是更高级别的线程安全机制的运用。我使用 lock/unlock 作为平台/语言特定的锁定机制的占位符。

let person = Person()
// Thread 1
lock(person)
person.firstName = "Name1"
person.lastName = "LastName1"
unlock(person)
// Thread 2
lock(person)
person.firstName = "Name2"
person.lastName = "LastName2"
unlock(person)

通过这种锁定/解锁,我们保证在person 上设置 firstNamelastName时会同时执行。

0
0 Comments

举个例子,考虑在32位处理器上运行的64位long整型。由于处理器一次只处理32位,更新long看起来像这样的伪汇编:

mov %r1, [addr]
mov %r2, [addr+4]

如果变量从值0开始,并尝试将0xffffffff写入该变量,那么有可能在这两个指令之间中断执行,并且读取内存的其他代码读取值0x0000ffff。原子更新保证整个值作为单个操作以某种方式写入,以便尽管(因为它不是线程安全的)不能保证另一个线程什么时候看到更新后的值,但保证每当它看到一个值时,它不会被部分地更新而是完全正确(即使可能过时)值。这个概念可以扩展到更复杂的数据类型。

0