weu*_*uhi 9 multithreading thread-safety ios swift
假设我有一个对象,多个线程可以读取/写入state
和someValue
变量.如果这些变量是int,double,enums等类型,我是否需要添加锁定?
enum State: String {
case one
case two
}
class Object {
var state: State
var someValue: Double
}
Run Code Online (Sandbox Code Playgroud)
是的你是.
想象一下两个线程试图添加1的情况someValue
.一个线程执行此操作:
someValue
入寄存器someValue
回如果两个线程在执行操作3之前执行操作1,则将获得与在另一个线程执行操作1之前一个线程完成所有三个操作的情况不同的答案.
还有一些更微妙的问题,因为优化编译器可能不会在一段时间内将修改后的值写回寄存器 - 如果有的话.此外,现代CPU具有多个核心,每个核心都有自己的缓存.CPU将值写回内存并不能保证它能够立即进入内存.它可能只是核心的缓存.您需要所谓的内存屏障,以确保将所有内容整齐地写回主内存.
在更大的范围内,您需要锁定以确保类中变量之间的一致性.因此,如果状态是要表示某些属性,someValue
例如它是否为整数,则需要锁定以确保每个人始终具有一致的视图,即
someValue
state
.上述三个操作必须看起来是原子的,或者如果在操作1之后但在操作3之前检查对象,则它将处于不一致状态.
归档时间: |
|
查看次数: |
970 次 |
最近记录: |